aggregate.formula
是一个标准的公式接口,用于对数据框进行聚合。
您好,Uri!您提到的aggregate
文档中说:
我是一名新手,不太理解这是什么意思。请允许我为您解释一下。
谢谢!
跳转到help(aggregate)
的示例部分的中间,您会看到以下内容:
## Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:
aggregate(weight ~ feed, data = chickwts, mean)
aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)
aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum)
这是四个不同的使用aggregate()
函数的实例,都采用了formula接口。在你引用的内容中所写的方式与R语言中使用的方法分派机制有关。
考虑第一个示例:
R> class(weight ~ feed)
[1] "formula"
R> class(chickwts)
[1] "data.frame"
所以首先聚合函数作用于第一个参数(类别是 formula
)。在R中,公式的解析通常围绕着一个 model.matrix
进行。我猜这里也类似,最终通过执行 aggregate.data.frame
与第二个参数 chickwts
(一个 data.frame
)进行等效调用。
R> aggregate(weight ~ feed, data = chickwts, mean)
feed weight
1 casein 323.583
2 horsebean 160.200
3 linseed 218.750
4 meatmeal 276.909
5 soybean 246.429
6 sunflower 328.917
R>
你所问的并不是最简单的初学者问题,我建议你彻底查看一些文档并阅读一本不错的 R 书籍,如果有的话。其他的 SO 问题也会推荐下一步该读什么。
编辑:我不得不挖掘一下,因为aggregate.formula()
并没有从stats
命名空间中导出,但您可以在提示符处键入stats:::aggregate.formula
来查看它——这清楚地显示它确实分发给aggregate.data.frame()
:
[.... some code omitted ...]
if (is.matrix(mf[[1L]])) {
lhs <- as.data.frame(mf[[1L]])
names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
}
else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
}
<environment: namespace:stats>
R>
cbind()
中所有列名的情况下完成此操作?对于多个列,我想不明白为什么不能使用aggregate(. ~ var, ...)
或者names <- c("var1", "var2", ...)
,然后使用aggregate(df[, names] ~ var, ...)
。或者这种方法根本行不通? - Hendy