R 从数据帧中嵌入的列表中获取虚拟(T/F)变量

R 从数据帧中嵌入的列表中获取虚拟(T/F)变量,r,dataframe,reduction,R,Dataframe,Reduction,我有一个data.frame,其中的单元格包含一个术语列表 我希望为列表中的每个术语生成一个新变量,指示该术语是否存在于给定单元格中 我在data.frame中有多个不同的这样的实例,不知道列表的组成 示例data.frame require(plyr) example<-data.frame(groups=letters) example<-adply(example, 1, function(x) data.fram

我有一个data.frame,其中的单元格包含一个术语列表

我希望为列表中的每个术语生成一个新变量,指示该术语是否存在于给定单元格中

我在data.frame中有多个不同的这样的实例,不知道列表的组成

示例data.frame

require(plyr)

example<-data.frame(groups=letters)

example<-adply(example,
               1,
               function(x) data.frame(value=t(list(sample(LETTERS, 4)))))

    groups      value
1      a F, Y, N, X
2      b N, D, B, Y
3      c W, J, S, U
4      d I, S, N, A
5      e S, Z, Y, A
6      f O, R, J, A

根据您的要求,这是功能表

示例

myMatrix <- checkValues(example, makeMatrix=TRUE)
myMatrix

#        A     B     C     D     E     F  ...
#   a FALSE FALSE FALSE FALSE FALSE FALSE ...
#   b FALSE FALSE FALSE FALSE FALSE  TRUE ...
#   c FALSE FALSE FALSE  TRUE FALSE FALSE ...
#   d FALSE  TRUE FALSE  TRUE FALSE FALSE ...
#   e  TRUE FALSE FALSE FALSE FALSE FALSE ...
#   .
#   .
#   .

myMatrix这里是一个
数据表和
重塑2
解决方案

library(data.table)
EX <- data.table(example)

data.table(dcast(EX[,list(value = unlist(value)),by=groups], groups~value))[,lapply(.SD, is.na),by = groups]

由于这里的输入,我还创建了一个require(plyr)解决方案

这两种解决方案都不那么优雅,但出于某种原因,我仍然觉得通读plyr解决方案更容易

创建一个可以生成单个虚拟变量的函数

single.value.to.dummy<-function(value.name, list.of.lists){
  ldply(.data=list.of.lists,
        function(list.element){ dummy<-value.name %in% list.element
                              names(dummy)<-value.name
                              return(dummy)
        })}

single.value.to.dummyGood一个。我想你应该把这个函数(t)变成一个函数(g)不,只是你的第一个答案有一个小的输入错误,
function(t)g%in%V
实际上应该是
function(g)g%in%V
。我很抱歉搞混了。另一个困惑是我不是问题的所有者:)
library(data.table)
EX <- data.table(example)

data.table(dcast(EX[,list(value = unlist(value)),by=groups], groups~value))[,lapply(.SD, is.na),by = groups]
EX[, setNames(as.list(LETTERS%in% unlist(value)), LETTERS),by = groups]
single.value.to.dummy<-function(value.name, list.of.lists){
  ldply(.data=list.of.lists,
        function(list.element){ dummy<-value.name %in% list.element
                              names(dummy)<-value.name
                              return(dummy)
        })}
list.of.lists.to.dummy<-function(list.of.lists){

#Extract unique values
  value.names<-unique(unlist(list.of.lists))

  dummy.frame<-llply(.data=value.names,
                      function(value.name){
                        dummy<-single.value.to.dummy(value.name, list.of.lists)
                        return(dummy)})

  return(data.frame(dummy.frame))
}

example<-cbind(example, list.of.lists.to.dummy(example$value))


groups      value     T     S     P     O     U     A     C     B     N     V     D     H     Y     F
1      a T, S, P, O  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
2      b U, A, C, B FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
3      c S, N, V, D FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
4      d H, Y, F, X FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
5      e M, Y, O, X FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
6      f Y, A, K, S FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE