跳转到示例部分的中间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
, a 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 问题给出了接下来要读什么的建议。)
Edit:我不得不挖一点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>