2011-07-18 37 views
2

假設我有一個觀察名單:數據幀

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" 

並與每個獨特元素的矢量:

vec <- LETTERS[1:6] 

> vec 
[1] "A" "B" "C" "D" "E" "F" 

我想獲得與計數數據幀foo的每個元素中的每個元素vec。我可以在一個非常醜陋的unvectorized方式與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 

但是,這顯然是緩慢的。這怎麼能更快地完成?我知道table(),但由於在foo的某些元素中有0計數,所以還沒有真正想到如何使用它。

回答

5

一個解決方案(把我的頭頂部):

# 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 
+0

完美,謝謝! –

1

或與重塑:

cast(melt(foo), L1 ~ value, length)[-1]