Dividir una columna en múltiples columnas ficticias binarias

Estoy tratando de dividir una sola variable de “carácter” en mi dataframe en varias variables de “factor”.

> sampledf=data.frame(vin=c('v1','v2','v3'),features=c('f1:f2:f3','f2:f4:f5','f1:f4:f5')) > sampledf vin features 1 v1 f1:f2:f3 2 v2 f2:f4:f5 3 v3 f1:f4:f5 > desireddf=data.frame(vin=c('v1','v2','v3'),f1=c(1,0,1),f2=c(1,1,0),f3=c(1,0,0),f4=c(0,1,1),f5=c(0,1,1)) > desireddf vin f1 f2 f3 f4 f5 1 v1 1 1 1 0 0 2 v2 0 1 0 1 1 3 v3 1 0 0 1 1 

Intenté usar strsplit() para separar la columna de “características”

 strsplit(as.character(df$features), ";") 

pero no han tenido suerte de factorizarlos.

Podemos usar mtabulate de qdapTools después de dividir ( strsplit(.. ) la columna ‘features’.

 library(qdapTools) cbind(sampledf[1],mtabulate(strsplit(as.character(sampledf$features), ':'))) # vin f1 f2 f3 f4 f5 #1 v1 1 1 1 0 0 #2 v2 0 1 0 1 1 #3 v3 1 0 0 1 1 

O podemos usar cSplit_e de la library(splitstackshape)

 library(splitstackshape) df1 <- cSplit_e(sampledf, 'features', ':', type= 'character', fill=0, drop=TRUE) names(df1) <- sub('.*_', '', names(df1)) 

O utilizando los métodos de base R , split como antes, establecemos los nombres de los elementos de la list del strsplit con la columna 'vin', convertimos a una clave / valor columnas 'data.frame' utilizando stack , get the table , transpose y cbind with la primera columna de 'sampleado'.

 cbind(sampledf[1], t(table(stack(setNames(strsplit(as.character(sampledf$features), ':'), sampledf$vin)))))