2017-02-16 38 views
1

我在數據框中有一列列表。我試圖將列表拆分爲數據集中的變量。在數據框中將列表拆分爲二進制變量R

例如,我有一個數據集的列是像

V1 <- c(1,2,3,4,5) 
V2 <- c(1,2,3,4,5) 
V3 <- c(1,2,3,4,5) 
V4 <- list(list("a","b","c"), 
     list("a","b","d"), 
     list("b","c","d"), 
     list("a","b","e"), 
     list("b","c","e")) 
V5 <- c(1,2,3,4,5) 
sample<-NA 
sample <- data.frame(V1,V2,V3,I(V4),V5) 

在此,v4包含列表

的列分割列表之後,期望的數據幀應該是如下

> sample 
    V1 V2 V3  V4 V5 V6 V7 V8 V9 V10 
1 1 1 1 a, b, c 1 1 1 1 0 0 
2 2 2 2 a, b, d 2 1 1 0 0 1 
3 3 3 3 b, c, d 3 0 1 1 1 0 
4 4 4 4 a, b, e 4 1 1 0 0 1 
5 5 5 5 b, c, e 5 0 1 1 0 1 

創建的新變量中的數據應該是1或0,如果它在各自的列表中可用。

這裏是我做同樣的方法,首先我確定列表中的所有獨特元素,並用NA創建相應的列,然後嘗試檢查特定變量是否在列表中,然後分配給其他1個0。

features <- c("a","b","c","d","e") 
l <-1 
for(j in 1:length(sample$V4)){ 
    for(k in 6:10){ 
    for(i in features){ 
     if(i %in% tolower(unlist(sample$V4[[j]]))){ 
     sample[j,k] <-1 
     print(sample[j,k]) 
     }else{ 
     sample[j,k] <-0 
     } 
     print(c(l,k,i,j)) 
     l <- l+1 

    } 
    } 

} 

我不知道這是怎麼了,這是給結果如下

> sample 
    V1 V2 V3  V4 V5 V6 V7 V8 V9 V10 
1 1 1 1 a, b, c 1 0 0 0 0 0 
2 2 2 2 a, b, d 2 0 0 0 0 0 
3 3 3 3 b, c, d 3 0 0 0 0 0 
4 4 4 4 a, b, e 4 1 1 1 1 1 
5 5 5 5 b, c, e 5 1 1 1 1 1 
+2

請顯示一個小的可重複的示例和預期的輸出,供其他人調試您的問題 – akrun

+0

@akrun謝謝!用可重現的代碼編輯。 –

+0

當元素不存在時,如何在預期輸出中獲得這些值1並不清楚。例如'b,c,e 5 0 0 0 1 1' – akrun

回答

2

我們可以使用mtabulateqdapTools

library(qdapTools) 
sample[paste0("V", 6:10)] <- mtabulate(sample$V4) 
+1

完美! 非常感謝 –

相關問題