我有一个数据框,其中包含带有锯齿状条目的列表向量:
df = data.frame(x = rep(c(1,2), 2), y = rep(c("a", "b"), each = 2))
L = list()
for (each in round(runif(4, 1,5))) L = c(L, list(1:each))
df$L = L
例如,
x y L
1 a 1
2 a 1, 2, 3, 4
1 b 1, 2, 3
2 b 1, 2, 3
我怎样才能创建一个表来计算每个x的L值,并计算y的值?所以,在这个例子中,它会输出类似的东西,
1 2 3 4
X
1 2 1 1 0
2 2 2 2 1
我运气好了
tablist = function(L) table(unlist(L))
tapply(df$L, df$x, tablist)
产生,
$`1`
1 2 3
2 1 1
$`2`
1 2 3 4
2 2 2 1
但是,我不确定如何从这里走到一张桌子。此外,我开始怀疑这种方法可能开始花费大量数据帧的时间。任何想法/建议将不胜感激!
答案 0 :(得分:2)
使用pylr
library(plyr)
df = data.frame(x = rep(c(1,2), 2), y = rep(c("a", "b"), each = 2))
L = list()
set.seed(2)
for (each in round(runif(4, 1,5))) L = c(L, list(1:each))
df$L = L
> df
x y L
1 1 a 1, 2
2 2 a 1, 2, 3, 4
3 1 b 1, 2, 3
4 2 b 1, 2
table(ddply(df,.(x),summarize,unlist(L)))
> table(ddply(df,.(x),summarize,unlist(L)))
..1
x 1 2 3 4
1 2 2 1 0
2 2 2 1 1
答案 1 :(得分:1)
如果你没有进入plyr ......
vals <- unique(unlist(df$L))
names(vals) <- vals
do.call("rbind",
lapply(split(df,df$x),function(byx){
sapply(vals, function(i){
sum(unlist(sapply(byx$L,"==",i)))
})
})
)