将列拆分为多个二进制虚拟列

时间:2015-10-06 19:52:50

标签: r dataframe

我试图分裂一个"字符"我的数据框中的变量变为多个因素"变量。

> 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

我尝试使用strsplit()分隔"功能"专栏

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

但没有运气因素。

1 个答案:

答案 0 :(得分:9)

我们可以在分割(mtabulate)'功能后使用qdapTools中的strsplit(..。列。

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

或者我们可以使用cSplit_e

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

或者使用base R方法,我们split和以前一样,设置liststrsplit元素的名称与&#39; vin&#39;列,转换为键/值列&quot; data.frame&#39;使用stack,获取table,转置和cbind第一列&#39; samplesf&#39;。

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