我想计算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.formula
和paste
生成公式,但没有运气。
答案 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)