R - 嵌套聚合

R - nested aggregate

我有一个像这样的 table d1(三列,JB Y 和 P)

JB  Y   P
AA  11  1
BB  11  2
AA  12  3
BB  12  4
AA  13  3
CC  12  4
CC  13  2
DD  11  1
DD  12  1
DD  13  3
BB  12  3

我想做的是获取嵌套聚合。我的意思是结果应该是这样的:

JB  Y   Avergare (P)
AA  11  1
AA  12  2
AA  13  3
BB  11  2
BB  12  3.5
CC  12  4
CC  13  2
DD  11  1
DD  12  1
DD  13  3

嵌套聚合首先使用 Y 而不是 JB 进行聚合并提供均值 P?不确定是否可能。我知道如何获得简单的聚合,但想知道是否有一种方法可以分两步(或更多步)分析数据

我们可以使用data.table

library(data.table)
setDT(df)[, list(P= mean(P)) , .(JB, Y)]

从表面上看,这是一个普通的 aggregate 问题,因此您有很多可用的工具。

在 base R 中,明显的候选者是 aggregate

aggregate(P ~ JB + Y, mydf, mean)

您也可以按照@eipi10 的建议使用 "dplyr" 包,如果您更喜欢这样的话:

library(dplyr)
mydf %>% group_by(JB, Y) %>% summarise(P = mean(P))

这是一个使用 data.table 的解决方案:

library(data.table)

dt <- data.table(
    JB = c("AA", "BB", "AA", "BB", "AA", "CC", "CC", "DD", "DD", "DD", "BB"),
    Y = c(11, 11, 12, 12, 13, 12, 13, 11, 12, 13, 12),
    P = c(1, 2, 3, 4, 3, 4, 2, 1, 1, 3, 3))

dt[order(JB), .(avg = mean(P)), by = .(JB, Y)]

中间的.()用于命名聚合结果。如果不需要订购,您可以省略第一部分,例如只是打电话 dt[, .(avg = mean(P)), by = .(JB, Y)].