2016-03-18 11 views
0

Ich habe einen Datenrahmen und ich möchte einen booleschen Datenrahmen daraus erstellen. Ich möchte alle eindeutigen Werte jeder Spalte im ursprünglichen Datenrahmen als Spaltennamen im booleschen Datenrahmen machen. Um zu zeigen, es an ein Beispiel:Erstellen eines booleschen Datenrahmens aus einem Datenrahmen in R

mydata = 
sex route 
m oral 
f oral 
m topical 
f unknown 

Dann will ich schaffen

m f oral topical unknown 
    1 0 1  0  0 
    0 1 1  0  0 
    1 0 0  1  0 
    0 1 0  0  1 

ich den Code verwenden unter dem bolean Datenrahmen zu erstellen. Es funktioniert in R aber nicht in glänzend. Was könnte das Problem sein?

col_names=c() 

for(i in seq(1,ncol(mydata))){ 

col_names=c(col_names,unique(mydata[i])) 
} 


col_names= as.vector(unlist(col_names)) 

my_boolean= data.frame(matrix(0, nrow = nrow(mydata), ncol =  length(col_names))) 

colnames(my_boolean)=col_names 

for(i in seq(1,nrow(mydata))){ 
    for(j in seq(1,ncol(mydata))) 
    { 
    my_boolean[i,which(mydata[i,j]==colnames(my_boolean))]=1 
    }} 
+0

Versuchen model.matrix mit: 'model.matrix (~ sex + Route - 1, mydata)' es ist sauberer – Raad

+0

Ich bin mit @NBATrends jedoch 'model.matrix (~ sex + route - 1, meine Daten) 'gibt Ihnen nicht das richtige Ergebnis, da eine der Kategorien als Basis verwendet wird. Um das zu beheben, können Sie 'cbind (modell.matrix (~ sex - 1, mydata), modell.matrix (~ route - 1, mydata))'. – Bayesric

+0

Sie müssen erklären, was nicht funktioniert in glänzend, um Hilfe mit diesem Teil Ihrer Frage zu bekommen. – A5C1D2H2I1M1N2O1R2T1

Antwort

3

Es gibt ein paar Möglichkeiten, wie Sie dies tun können, aber ich finde immer table am einfachsten zu verstehen. Hier ist ein Ansatz mit table:

do.call(cbind, lapply(mydf, function(x) table(1:nrow(mydf), x))) 
## f m oral topical unknown 
## 1 0 1 1  0  0 
## 2 1 0 1  0  0 
## 3 0 1 0  1  0 
## 4 1 0 0  0  1 
Verwandte Themen