将数据框中的列表拆分为R中的二进制变量

时间:2017-02-16 07:01:35

标签: r list for-loop dataframe

我在数据框中有一列列表。我试图将列表拆分为数据集中的变量。

例如,我有一个数据集,其列类似于

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. / p>

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 

1 个答案:

答案 0 :(得分:2)

我们可以使用mtabulate

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