43

1つの列が種の名前で、2番目の列が存在量の値であるデータフレームがあります。サンプリング手順により、一部の種は複数回表示されます(つまり、種Xを含む行が複数あります)。それらのエントリを統合し、それらの存在量を合計したいと思います。

たとえば、次のデータフレームがあるとします。

set.seed(6)
df=data.frame(
  x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"),
  y=rpois(7,2)); df

これは以下を生成します:

    x y
1 sp1 2
2 sp2 4
3 sp3 1
4 sp3 1
5 sp4 3
6 sp2 5
7 sp3 5

代わりに以下を作成したいと思います。

    x y
1 sp1 2    
2 sp2 9     (5+4)
3 sp3 7     (5+1+1)
5 sp4 3

あなたが提供できるどんな助けにも前もって感謝します!

4

6 に答える 6

54

これは機能します:

library(plyr)
ddply(df,"x",numcolwise(sum))

つまり、(1)データフレームdf"x"列で分割します。(2)チャンクごとに、各数値列の合計を取ります。(3)結果を単一のデータフレームに貼り付けます。( 「入力としてデータフレームを取得し、データフレームを返すddddplyです)

別の、おそらくより明確なアプローチ:

aggregate(y~x,data=df,FUN=sum)

関連する(少し複雑な)質問については、平均/分散の要約テーブルを作成するための迅速でエレガントな方法を参照してください。

于 2012-04-16T19:12:36.583 に答える
29

単純なaggregate

aggregate(df['y'], by=df['x'], sum)
于 2012-04-16T19:15:39.883 に答える
13

dplyr解決策:

library(dplyr)
df %>% group_by(x) %>% summarise(y = sum(y))
于 2016-01-05T13:34:22.283 に答える
9

時間とメモリの効率のためのdata.tableソリューション

library(data.table)
DT <- as.data.table(df)
# which columns are numeric 
numeric_cols <- which(sapply(DT, is.numeric))
DT[, lapply(.SD, sum), by = x, .SDcols = numeric_cols]

または、あなたの場合、y合計したい列が1つしかないことがわかっている場合

DT[, list(y=sum(y)),by=x]
于 2012-09-13T04:13:38.903 に答える
6
> tapply(df$y, df$x, sum)
sp1 sp2 sp3 sp4 
  2   9   7   3 

data.frameそれがベンの答えでなければならない場合はうまくいきます。または、tapply出力を強制することができます。

out <- tapply(df$y, df$x, sum)
>     data.frame(x=names(out), y=out, row.names=NULL)
    x y
1 sp1 2
2 sp2 9
3 sp3 7
4 sp4 3
于 2012-04-16T19:16:27.070 に答える
2

2番目の変数(つまり、ここでは「Z」であり、「X」に加えて)を尊重する式が実際に機能するかどうかを検証するためのMWE:

example = data.frame(X=c("x"),Z=c("a"),Y=c(1), stringsAsFactors=F)
newrow = c("y","b",1)
example <- rbind(example, newrow)
newrow = c("z","a",0.5)
example <- rbind(example, newrow)
newrow = c("x","b",1)
example <- rbind(example, newrow)
newrow = c("x","b",2)
example <- rbind(example, newrow)
newrow = c("y","b",10)
example <- rbind(example, newrow)
example$X = as.factor(example$X)
example$Z = as.factor(example$Z)
example$Y = as.numeric(example$Y)
example_agg <- aggregate(Y~X+Z,data=example,FUN=sum)
于 2016-01-05T13:31:04.563 に答える