我正在尝试将aggregate
函数与cbind
一起使用,但我必须遗漏一些内容。
我在Using Aggregate for Multiple Aggregations中看到我可以简单地定义我想要修复哪一列以及我想添加哪一列,但我无法得到我期望的结果。
我有:
x <- data.frame(alfa = 1:9, beta = rep(1:3, 3))
alfa beta
1 1 1
2 2 2
3 3 3
4 4 1
5 5 2
6 6 3
7 7 1
8 8 2
9 9 3
我想检索由 beta 列中的条目汇总的条目的平均值。为此,我尝试过:
aggregate(cbind(alfa) ~ beta, data = x, FUN = function(x) c(gama = mean(x)) )
这让我:
beta alfa
1 1 4
2 2 5
3 3 6
结果不应该是:
alfa beta gama
1 1 1 4
2 2 2 5
3 3 3 6
如何强制添加 gama 列?另外,有人会澄清cbind()
函数的基础吗?我一直在努力去理解它。此致!
答案 0 :(得分:6)
Aggregate获取~
左侧的所有元素,并对这些值使用给定函数,而它们按右侧的值进行分组。
因此,你的命令
aggregate(alfa ~ beta, data=x, mean)
将返回按alfa
分组的beta
的平均值。 (正如您提到的SQL - 这与SQL子句SELECT beta, avg(alfa) FROM x GROUP BY beta
)
如果要输出遇到的第一个值,这基本上是你想要做的另一个聚合,因此你的聚合函数必须返回两个值:
aggregate(alfa ~ beta, data=x, function(x) c(alfa=x[1], gamma=mean(x)))
(再次在SQL中:SELECT beta, min(alfa), avg(alfa) FROM x GROUP BY beta
)
您问过cbind
。只要左手边只有一个参数,这根本不重要。但是假设您有以下情况:
x <- data.frame(alfa = 1:9, beta = rep(1:3, 3), gamma = rnorm(9))
并且想要计算,例如,alfa
和gamma
列的平均值,你可以这样做:
aggregate(cbind(alfa, gamma) ~ beta, data=x, function(x) mean(x))
这样你只需告诉聚合函数在给定函数中使用throw alfa
和gamma
。
有关更多详尽的示例,请参阅?aggregate
。
你必须小心,不要混淆cbind
的不同含义。使用单独的函数,它将两个相同长度的向量(或data.frames)连接到矩阵(或data.frame),两个输入都作为不同的列:
> cbind(1:3, 7:9)
[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
在汇总cbind
的公式表示法中使用了相关但却不同的东西。 cbind(column1, column2)
只是告诉聚合使用分别这两行的给定函数。因此,像
aggregate(cbind(alfa, gamma) ~ beta, data=x, function(x) mean(x[,1]*x[,2]))
将不工作。相反,该函数将被调用两次 - 一次使用alfa
的值,然后使用值beta
。
希望澄清你的理解。