2015-10-06 23 views
2

我试图将我的数据框中的单个“字符”变量拆分为多个“因子”变量。将列拆分为多个二元虚拟列

> 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), ";") 

尝试,但没有运气因子分解它们。

回答

3

在分割(strsplit(..)“特征”列后,我们可以使用mtabulateqdapTools

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_elibrary(splitstackshape)

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

或者用base R方法,我们split像以前一样,从strsplit与“VIN”列设置list元素的名称,转换成键/值列'data.frame'使用stack,得到table,转置和cbind与'sampledf'的第一列。

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

他们完美的工作!但有没有办法使用基本功能来做到这一点? – outlier123

+0

@ outlier123添加了一个基本的R选项。 – akrun

+0

真棒!非常感谢Akrun! (Rep太低而无法公开上传) – outlier123