20

次のようなデータフレームがあります。

a   b1  b2  b3  b4  b5  b6  b7  b8  b9
D   4   6   9   5   3   9   7   9   8
F   7   3   8   1   3   1   4   4   3
R   2   5   5   1   4   2   3   1   6
D   9   2   1   4   3   3   8   2   5
D   5   4   3   1   6   4   1   8   3
R   3   7   9   1   8   5   3   4   2
D   4   1   8   2   6   3   2   7   5
F   7   1   7   2   7   1   6   2   4
D   6   3   9   3   9   9   7   1   2

この関数tapply(df[,2], INDEX = df$a, sum)は、df[,2] のすべてを df$a で合計するテーブルを生成するために正常に機能tapply(df[,2:10], INDEX = df$a, sum)しますが、同様のテーブルを取得しようとすると、各列の合計 (2、3、4、...、 10)、次のようなエラー メッセージが表示されます。

tapply(df[, 2:10], INDEX = df$a, sum) のエラー: 引数は同じ長さでなければなりません

さらに、テーブルの行名を の列名にしてdf[,2:10]、行 1 を b1、行 2 を b2、行 9 を b9 にしたいと考えています。

4

3 に答える 3

22

これは、tapply がベクトルで機能し、df[,2:10] をベクトルに変換するためです。その横にある sum は、列ごとの合計ではなく、合計を示します。使用aggregate()、例:

aggregate(df[,2:10],by=list(df$a), sum)

リストを返したい場合は、 by() を使用できます。分割されたデータフレームで機能するため、合計ではなく colSums を指定してください。

by(df[,2:10],df$a,FUN=colSums)
于 2011-08-11T16:52:45.467 に答える
6

data.tableこの問題に適用する方法を次に示します。

library(data.table)
DT <- data.table(df)
DT[, lapply(.SD, sum), by=a]

そして、ここにdplyrアプローチがあります

library(dplyr)
df %>% group_by(a) %>% summarise_all(funs(sum))
于 2015-06-01T07:19:26.663 に答える