onsdag 2 maj 2012

Data till kolumner

En av de få saker jag gillar med Excel är funktionen "data till kolumner". Jag har därför just suttit och programmerat en motsvarande funktion till R (fick ett dataset i behov av en del handpåläggning från en klient).  Och nej, jag vill inte veta om det redan fanns!

Kod nedan. (Skönhetsupplevelse utlovas ej!)



data.to.columns<-function(Oldcol, Separators){
  antal<-nchar(as.character(Oldcol), type="chars")
  maxantal<-max(antal)
  tempframe<-as.data.frame(matrix(NA,length(Oldcol),maxantal))
  new.col<-as.data.frame(matrix(0,length(Oldcol),maxantal))
  col.assign<-as.data.frame(matrix(0,length(Oldcol),maxantal))
    for (i in 1:maxantal){
    tempframe[antal>=i,i]<-substr(Oldcol[antal>=i],i,i)

    for (separators in 1:length(Separators)){
       new.col[!is.na(tempframe[,i])&tempframe[,i]==Separators[separators],i]<-1
    }
    if (i==1){
      col.assign[!is.na(tempframe[,i]),i]<-1}
 
    if (i>1){
    col.assign[!is.na(tempframe[,i]),i]<-new.col[!is.na(tempframe[,i]),i]+col.assign[!is.na(tempframe[,i]),i-1]}
    }

for (i in 1:maxantal){
  col.assign[new.col[,i]==1,i]<-0
}
n.new.col<-max(apply(new.col,1,sum))+1
new.data<-matrix("",length(Oldcol),n.new.col)
for (columns in 1:n.new.col){
  for (i in 1:maxantal){
      new.data[col.assign[,i]==columns,columns]<-(paste(new.data[col.assign[,i]==columns,columns],tempframe[col.assign[,i]==columns,i], sep=""))
    }
  }
new.columns<-as.data.frame(new.data)
return(new.columns)
}

Exempel:


testdata<-c("NA","34+15+Okänt","45+35+NA+17", "2+4", "35 NA" )
data.to.columns(Oldcol=testdata, Separators=c("+"," "))

Inga kommentarer:

Skicka en kommentar