可能重复:
Aggregate R sum
我有一个如下所示的数据框:
sample value
1 a 1
2 a 2
3 b 3
4 b 4
5 b 5
6 c 6
我需要在sample
级别上折叠数据框(可能是一个字符向量或一个因子),添加所有value
,所以我得到的结果数据框如下所示:< / p>
sample sum
1 a 3
2 b 12
3 c 6
星期一早上,我能想到的只是写一个复杂的for
循环。我怎样才能使用apply,plyr等对它进行矢量化?
答案 0 :(得分: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
答案 1 :(得分:4)
我喜欢演员,因为它快速而直观,因为这些类型的问题:
library(reshape2)
dcast(your_df, sample ~ ., sum) # or just cast with the original reshape
我也喜欢总结一下这类问题。
library(plyr)
ddply(df,.(sample),summarise, sum=sum(value))
答案 2 :(得分:4)
本着分享的精神,您还可以非常轻松地使用sqldf
和data.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
答案 3 :(得分: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))
和 聚合 两者都有效但输入输出为列表或 by 对象太愚蠢了。来自 plyr 的 ddply 也会有效,但语法上不太清晰,尽管它更适用于更复杂的示例
答案 4 :(得分:1)
使用R base函数的一种解决方案是
aggregate(x = df$value, by = list(df$sample), FUN = sum)
您也可以使用plyr package
中的ddply
来完成此操作
ddply(df,.(sample),numcolwise(sum))
此处df
是您的data.frame