在R语言中,“标准公式接口到数据框架”是什么意思?

7

aggregate.formula是一个标准的公式接口,用于对数据框进行聚合。

您好,Uri!您提到的aggregate文档中说:

我是一名新手,不太理解这是什么意思。请允许我为您解释一下。

谢谢!

1个回答

10

跳转到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> 

4
有没有一种方法可以在不列出 cbind() 中所有列名的情况下完成此操作?对于多个列,我想不明白为什么不能使用 aggregate(. ~ var, ...) 或者 names <- c("var1", "var2", ...),然后使用 aggregate(df[, names] ~ var, ...)。或者这种方法根本行不通? - Hendy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接