2017-02-16 18 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

完美! 非常感谢 –

相关问题