1

可能重复:
聚合 R 总和

我有一个看起来像这样的数据框:

  sample value
1      a     1
2      a     2
3      b     3
4      b     4
5      b     5
6      c     6

我需要在sample(可能是字符向量或因子)的级别上折叠数据框,添加所有values,所以我的结果数据框如下所示:

  sample sum
1      a   3
2      b  12
3      c   6

现在是星期一早上,我能想到的就是写一个复杂的for循环。我如何使用 apply、plyr 等对其进行矢量化?

4

5 回答 5

7

如果您不想加载包:

df <- read.table(text="  sample value
1      a     1
2      a     2
3      b     3
4      b     4
5      b     5
6      c     6",header=TRUE)

aggregate(df$value,by=list(sample=df$sample),sum)

  sample  x
1      a  3
2      b 12
3      c  6

或者,如果您更喜欢公式语法:

aggregate(value ~ sample, df, sum)

  sample value
1      a     3
2      b    12
3      c     6
于 2012-11-26T14:54:36.450 回答
4

对于这些类型的问题,我喜欢 cast,因为它快速且直观:

library(reshape2)
dcast(your_df, sample ~ ., sum) # or just cast with the original reshape

对于这类问题,我也喜欢总结。

library(plyr) 
ddply(df,.(sample),summarise, sum=sum(value))
于 2012-11-26T14:52:37.870 回答
4

本着分享的精神,你也可以很容易地使用sqldfdata.table包:

您的数据:

df <- read.table(text="  sample value
1      a     1
2      a     2
3      b     3
4      b     4
5      b     5
6      c     6",header=TRUE)

sqldf替代方案:

library(sqldf)
sqldf("select sample, sum(value) `value` from df group by sample")
#   sample value
# 1      a     3
# 2      b    12
# 3      c     6

data.table替代方案:

library(data.table)
DT <- data.table(df, key="sample")
DT[, list(value = sum(value)), by=key(DT)]
#    sample value
# 1:      a     3
# 2:      b    12
# 3:      c     6
于 2012-11-26T16:08:01.240 回答
3

“经典” R 命令是tapply

n <- 17; fac <- factor(rep(1:3, length = n), levels = 1:5)
df=data.frame(target=1:n, factor=fac)
with(df, tapply(target, fac, sum))

byaggregate两者都可以工作,但是作为列表或对象的输入输出是愚蠢的。来自 plyr 的ddply可以工作,但在语法上不太清楚,尽管它在更复杂的示例中发挥作用

于 2012-11-26T15:08:39.423 回答
1

使用 R 基函数的一种解决方案是

aggregate(x = df$value, by = list(df$sample), FUN = sum)

您也可以使用ddplyfrom plyr package

ddply(df,.(sample),numcolwise(sum))

df是你的data.frame

于 2012-11-26T14:58:38.123 回答