我想從該數據集創建虛擬變量: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 B1 1 1,3,22 2 2,1,3,63 3 3,2,5,1,74 4 3,7,4,2,6,55 5 4,10,7,3,5,6所需的輸出應如下所示:A 1 2 3 4 5 6 7 8 9 101 1 1 1 0 0 0 0 0 0 02 1 1 1 0 0 1 0 0 0 03 1 1 1 0 1 0 1 0 0 04 0 1 1 1 1 1 1 0 0 05 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分鐘)。預先感謝您的回答。
3 回答

哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
你可以用一種方法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) <- cols
df
# 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
我們的想法是,我們在所需的列中獲得唯一值的向量,找到該max值并創建一個向量,1:max(value)然后將其應用于每一行,以找出該行的哪些值在所有值的向量中。ifelse如果有的話,我們通常會放一個1,如果沒有的話,我們會放0。將vector在我們的比賽是一個序列,因此其輸出為準備進行排序。
- 3 回答
- 0 關注
- 748 瀏覽
添加回答
舉報
0/150
提交
取消