字符串变量中的虚拟变量

我想从该数据集创建虚拟变量:


DF<-structure(list(A = c(1, 2, 3, 4, 5), B = c("1,3,2", "2,1,3,6", 

  "3,2,5,1,7", "3,7,4,2,6,5", "4,10,7,3,5,6")), .Names = c("A", "B"), 

              row.names = c(NA, 5L), class = "data.frame")

> DF

  A                  B

1 1              1,3,2

2 2            2,1,3,6

3 3          3,2,5,1,7

4 4        3,7,4,2,6,5

5 5       4,10,7,3,5,6

所需的输出应如下所示:


A  1  2  3  4  5  6  7  8  9  10

1  1  1  1  0  0  0  0  0  0  0

2  1  1  1  0  0  1  0  0  0  0

3  1  1  1  0  1  0  1  0  0  0

4  0  1  1  1  1  1  1  0  0  0

5  0  0  1  1  1  1  1  0  0  1

有没有一种有效的方法来做这种事情?我可以使用strsplit或ifelse。原始数据集非常大,有很多行(> 10k),列B中的值(> 15k)。dummy包中的功能dummies无法正常运行。


我也发现了类似的情况:将一列拆分为多列。但是在我的情况下,以上链接的解决方案确实工作缓慢(在Dell i7-2630QM,8Gb,Win7 64位,R 2.15.3 64位上,最多15分钟)。


预先感谢您的回答。


回首忆惘然
浏览 677回答 3
3回答

哈士奇WWW

你可以用一种方法ifelse和strsplit(除非我误解,你不希望使用他们?)是这样的....cols <- 1:max( as.numeric( unlist(strsplit(DF$B,","))))df <- t(apply(DF["B"] , 1 , function(x) ifelse( cols %in% as.numeric( unlist( strsplit(x , ",") ) ) , 1 , 0 ) ) )colnames(df) <- colsdf#&nbsp; 1 2 3 4 5 6 7 8 9 10#1 1 1 1 0 0 0 0 0 0&nbsp; 0#2 1 1 1 0 0 1 0 0 0&nbsp; 0#3 1 1 1 0 1 0 1 0 0&nbsp; 0#4 0 1 1 1 1 1 1 0 0&nbsp; 0#5 0 0 1 1 1 1 1 0 0&nbsp; 1我们的想法是,我们在所需的列中获得唯一值的向量,找到该max值并创建一个向量,1:max(value)然后将其应用于每一行,以找出该行的哪些值在所有值的向量中。ifelse如果有的话,我们通常会放一个1,如果没有的话,我们会放0。将vector在我们的比赛是一个序列,因此其输出为准备进行排序。
打开App,查看更多内容
随时随地看视频慕课网APP