1

ギザギザのエントリを持つリスト ベクトルを含むデータ フレームがあります。

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

y の値全体で、各 x の L の値をカウントするテーブルを作成するにはどうすればよいですか? したがって、この例では、次のような出力になります。

    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 

ただし、ここから単一のテーブルに移動する方法がわかりません。また、このアプローチでは、大きなデータ フレームに対して手に負えないほどの時間がかかり始める可能性があるのではないかと疑い始めています。ご意見/ご提案は大歓迎です!

4

2 に答える 2

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
于 2012-07-27T21:52:13.967 に答える
1

あなたがプライヤーに興味がないなら...

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)))
        })
    })
)
于 2012-07-28T00:06:46.820 に答える