web-dev-qa-db-ja.com

列値に基づく行の合計

1つの列に同じ値を持つ行を合計したい:

> df <- data.frame("1"=c("a","b","a","c","c"), "2"=c(1,5,3,6,2), "3"=c(3,3,4,5,2))
> df
  X1 X2 X3
1  a  1  3
2  b  5  3
3  a  3  4
4  c  6  5
5  c  2  2

1つの列(X2)について、データを集計して、同じX1値を持つすべての行の合計を取得できます。

> ddply(df, .(X1), summarise, X2=sum(X2))
  X1 X2
1  a  4
2  b  5
3  c  8

X3とX1以外の任意の数の列で同じことを行うにはどうすればよいですか?

これは私が望む結果です:

  X1 X2 X3
1  a  4  7
2  b  5  3
3  c  8  7
30
R-obert
ddply(df, "X1", numcolwise(sum))

見る ?numcolwise詳細および例。

26
Ista

aggregateは、式インターフェイスを使用して簡単にこれを行うことができます。

aggregate(. ~ X1, data=df, FUN=sum)
##   X1 X2 X3
## 1  a  4  7
## 2  b  5  3
## 3  c  8  7

同等:

aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum)
22

aggregateは、次のようなものに最適な関数です。

aggregate(df[,-1],df["X1"],sum)

  X1 X2 X3
1  a  4  7
2  b  5  3
3  c  8  7

そして、plyrのnumcolwiseメソッドのベースRバージョン:

aggregate(df[,sapply(df,is.numeric)],df["X1"],sum)
6
thelatemail

メモリ効率とコーディングの優雅さのためのdata.tableソリューション

library(data.table)
DT <- data.table(df)


DT[, lapply(.SD, sum), by = X1]

.SDは、X1の値で定義された各グループのdata.tableのサブセットです。 data.tableパッケージに関連する3つの便利なビネットがあります。

5
mnel