Database R:第1组而非第2组的聚合

Database R:第1组而非第2组的聚合,database,r,aggregate,Database,R,Aggregate,我正在尝试创建两个数据集,其中一个数据集通过两组数据进行汇总,我使用以下代码完成了这一工作: x = rnorm(1:100) g1 = sample(LETTERS[1:3], 100, replace = TRUE) g2 = sample(LETTERS[24:26], 100, replace = TRUE) aggregate(x, list(g1, g2), mean) 第二组需要按第一组而不是第二组汇总数据 如果我们从前面的例子中考虑可能的对: A - X B - X

我正在尝试创建两个数据集,其中一个数据集通过两组数据进行汇总,我使用以下代码完成了这一工作:

x = rnorm(1:100)
g1 = sample(LETTERS[1:3], 100, replace = TRUE)
g2 = sample(LETTERS[24:26], 100, replace = TRUE)

aggregate(x, list(g1, g2), mean)
第二组需要按第一组而不是第二组汇总数据

如果我们从前面的例子中考虑可能的对:

A - X    B - X    C - X
A - Y    B - Y    C - Y
A - Z    B - Z    C - Z
第二个数据集应将数据汇总为外组的平均值

A - not X
A - not Y
A - not Z etc. 
有没有办法操纵R中的聚合函数来实现这一点? 或者我还认为可能有一个虚拟变量可以用这种方式表示数据,尽管我不确定它会是什么样子

我在这里找到了答案:

我认为这表明每个配对都需要一个虚拟变量。然而,如果有人能够提供更好或更有效的方法,我们将不胜感激,因为真实数据集中有许多配对


提前感谢

首先让我们重复生成数据(使用
set.seed
):

现在我们有两个解决方案,都使用聚合:

1)ave

# x equals the sums over the groups and n equals the counts
ag = cbind(aggregate(x, list(g1, g2), sum),
            n = aggregate(x, list(g1, g2), length)[, 3])

ave.not <- function(x, g) ave(x, g, FUN = sum) - x
transform(ag, 
     x = NULL, # don't need x any more
     n = NULL, # don't need n any more
     mean = x/n, 
     mean.not = ave.not(x, Group.1) / ave.not(n, Group.1)
)
要再次检查均值和均值下的第一个值,请执行以下操作:

> mean(x[g1 == "A" & g2 == "X"])
[1] 0.3155084
> mean(x[g1 == "A" & g2 != "X"])
[1] -0.09189883
2)sapply这里有第二种方法给出了相同的答案:

ag <- aggregate(list(mean = x), list(g1, g2), mean)
f <- function(i) mean(x[g1 == ag$Group.1[i] & g2 != ag$Group.2[i]]))
ag$mean.not = sapply(1:nrow(ag), f)
ag

你好,谢谢你的回答。如果你能解释一下你的代码是如何工作的,那就太好了。虽然我认为这不是我想要的。如果结果正确,则应显示A&而不是X=平均值(AY和AZ)。在这种情况下,我已对其进行了修改。
> mean(x[g1 == "A" & g2 == "X"])
[1] 0.3155084
> mean(x[g1 == "A" & g2 != "X"])
[1] -0.09189883
ag <- aggregate(list(mean = x), list(g1, g2), mean)
f <- function(i) mean(x[g1 == ag$Group.1[i] & g2 != ag$Group.2[i]]))
ag$mean.not = sapply(1:nrow(ag), f)
ag