3

次のような data.frames のリストがあります。

df=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(1,2,2,3,3,2,3,1,1,3))
df2=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(2,1,3,1,1,1,2,1,2,1))
df3=data.frame(
data_id=rep(LETTERS[1:10],each=1),
data_value=c(2,2,3,3,1,2,2,1,2,3))
df.list <- list(df, df2, df3)

単一の data.frame は次のようになります。

         data_id    data_value
1        A          1
2        B          2
3        C          2
4        D          3
5        E          3
6        F          2
7        G          3
8        H          1
9        I          1
10       J          3

各一意の値が data_value に出現する頻度をカウントしたいと考えています。私がすることができます:

for(i in 1:length(df.list)){
    daply(df.list[[i]], .(df.list[[i]]$data_value), nrow) -> freq
}

これにより、頻度カウントが得られます(この場合、df3の最後のもののみ):

1 2 3 
2 5 3 

私の実際のデータセットははるかに大きいため、ここに投稿することはできません。ただし、構造はまったく同じです。問題は、実際のデータセットの頻度カウントを取得しようとすると、次のエラー メッセージが表示されることです。

Error in dim(out_array) <- out_dim : dims [product 0] do not match the length of object [1]

これを修正するためにどこから探す必要があるか誰か教えてもらえますか? 「dim()」がどこに入って何をするのかわかりません。どうもありがとう。

4

1 に答える 1

8

forループを に置き換えることで、実際にはそれよりも優れたことができますlaply。これは、入力がリストで、出力が行列/配列であることを意味します。

o <- laply(df.list, function(x) {
    table(x$data_value)
})
> o
#      1 2 3
# [1,] 3 3 4
# [2,] 6 3 1
# [3,] 2 5 3

エラーの理由を確認するために、これを試すとどうなりますか?

o <- llply(df.list, function(x) {
    table(x$data_value)
})

編集:エラーをより理解しやすくするために、このdata.frameを作成しましょう:

d1 <- data.frame(a=1:4)
d2 <- data.frame(a=1:5)
d3 <- data.frame(a=1:6)
d4 <- data.frame(a=1:7)

dl <- list(d1,d2,d3,d4)

今実行しますlaply

laply(dl, function(x) table(x$a))
# Error: Results must have the same dimensions.

なぜ?それを見るために、それを印刷しましょう:

> laply(dl, function(x) print(table(x$a)))

# 1 2 3 4 
# 1 1 1 1 
# 
# 1 2 3 4 5 
# 1 1 1 1 1 
# 
# 1 2 3 4 5 6 
# 1 1 1 1 1 1 
# 
# 1 2 3 4 5 6 7 
# 1 1 1 1 1 1 1 

# Error: Results must have the same dimensions.

問題がわかりますか?各行の要素数は異なります。行列を使用することはできません (行と同じになるように小さい要素を追加しない限り)。

[[number]]代わりに、リストを使用して、後で構文を使用してアクセスできるリストの要素にします。

llply(dl, function(x) table(x$a))

# [[1]]
# 
# 1 2 3 4 
# 1 1 1 1 
# 
# [[2]]
# 
# 1 2 3 4 5 
# 1 1 1 1 1 
# 
# [[3]]
# 
# 1 2 3 4 5 6 
# 1 1 1 1 1 1 
# 
# [[4]]
# 
# 1 2 3 4 5 6 7 
# 1 1 1 1 1 1 1 

これで問題が解決することを願っています。

于 2013-02-13T16:18:50.070 に答える