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