通过公式汇总

时间:2014-03-17 16:38:13

标签: r dataframe aggregate

我想计算data.frame中多个变量的groupby统计数据。

我知道你可以这样做:

aggregate(cbind(Ozone, Temp) ~ Month, data=airquality, mean)

但是如何让它更通用?也就是说,不是像cbind(Ozone, Temp)那样明确指定变量名,而是想做(例如)

aggregate(names(airquality)[1:10] ~ Month, data=airquality, mean)

这不起作用,因为names(airquality)[1:10]将是一个字符串向量。

我该怎么做?我尝试使用as.formulapaste生成公式,但没有运气。

2 个答案:

答案 0 :(得分:2)

也许您可以从另一个角度工作,只需更改“data”参数:

aggregate(. ~ Month, data = airquality[, c("Ozone", "Temp", "Month")], mean)
#   Month    Ozone     Temp
# 1     5 23.61538 66.73077
# 2     6 29.44444 78.22222
# 3     7 59.11538 83.88462
# 4     8 59.96154 83.96154
# 5     9 31.44828 76.89655

aggregate(. ~ Month, data = airquality[, c(1, 4, 5)], mean)
#   Month    Ozone     Temp
# 1     5 23.61538 66.73077
# 2     6 29.44444 78.22222
# 3     7 59.11538 83.88462
# 4     8 59.96154 83.96154
# 5     9 31.44828 76.89655

答案 1 :(得分:1)

这是一种方式。

df <- data.frame(group=rep(1:5,each=10),x=rnorm(100),y=rnorm(100),z=rnorm(100))
aggregate(df[,c("x","y","z")],by=list(df$group),mean)
#   Group.1           x           y             z
# 1       1 -0.06100408  0.04669238  0.0003988935
# 2       2  0.03195340 -0.04475700  0.1851086065
# 3       3 -0.19219404 -0.01944643  0.4282583083
# 4       4  0.22507825 -0.43640489 -0.3980140143
# 5       5  0.35749140  0.38679963 -0.2421865009

这也是一样的。

aggregate(df[,2:4],by=list(df$group),mean)