假设我有一个观察列表:
foo <- list(c("C", "E", "A", "F"), c("B", "D", "B", "A", "C"), c("B",
"C", "C", "F", "A", "F"), c("D", "A", "A", "D", "D", "F", "B"
))
> foo
[[1]]
[1] "C" "E" "A" "F"
[[2]]
[1] "B" "D" "B" "A" "C"
[[3]]
[1] "B" "C" "C" "F" "A" "F"
[[4]]
[1] "D" "A" "A" "D" "D" "F" "B"
Run Code Online (Sandbox Code Playgroud)
并且每个独特元素都有一个向量:
vec <- LETTERS[1:6]
> vec
[1] "A" "B" "C" "D" "E" "F"
Run Code Online (Sandbox Code Playgroud)
我想获得一个数据框,其中包含每个元素vec
中每个元素的计数foo
.我可以用plyr
一种非常丑陋的未经实现的方式来做到这一点:
> ldply(foo,function(x)sapply(vec,function(y)sum(y==x)))
A B C D E F
1 1 0 1 0 1 1
2 1 2 1 1 0 0
3 1 1 2 0 0 2
4 2 1 0 3 0 1
Run Code Online (Sandbox Code Playgroud)
但那显然很慢.怎么能更快地完成?我知道,table()
但由于0的一些元素中的0计数,还没有真正弄清楚如何使用它foo
.
一个解决方案(在我的头顶):
# convert foo to a list of factors
lfoo <- lapply(foo, factor, levels=LETTERS[1:6])
# apply table() to each list element
t(sapply(lfoo, table))
A B C D E F
[1,] 1 0 1 0 1 1
[2,] 1 2 1 1 0 0
[3,] 1 1 2 0 0 2
[4,] 2 1 0 3 0 1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136 次 |
最近记录: |