使用cbind聚合函数

时间:2012-11-29 19:18:25

标签: r aggregate

我正在尝试将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()函数的基础吗?我一直在努力去理解它。此致!

1 个答案:

答案 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))

并且想要计算,例如,alfagamma列的平均值,你可以这样做:

aggregate(cbind(alfa, gamma) ~ beta, data=x, function(x) mean(x))

这样你只需告诉聚合函数在给定函数中使用throw alfagamma

有关更多详尽的示例,请参阅?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

希望澄清你的理解。