R 从数据帧中嵌入的列表中获取虚拟(T/F)变量
我有一个data.frame,其中的单元格包含一个术语列表 我希望为列表中的每个术语生成一个新变量,指示该术语是否存在于给定单元格中 我在data.frame中有多个不同的这样的实例,不知道列表的组成 示例data.frameR 从数据帧中嵌入的列表中获取虚拟(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
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