1

我正在尝试使用该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

如何强制添加 column gama?另外,有人会澄清该cbind()功能的基础吗?我一直在努力理解它。问候!

4

1 回答 1

6

聚合获取左侧的所有元素并对~这些值使用给定的函数,同时它们按右侧的值分组。因此,您的命令

aggregate(alfa ~ beta, data=x, mean)

alfa将返回按 分组的平均值beta。(正如您提到的 SQL - 这与 SQL-clause 发生的情况相同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))

这样,您只需告诉聚合函数在给定函数上使用 throwalfagamma两者。

有关更多和详尽的示例,请参阅?aggregate


编辑

你必须小心不要混合不同的含义cbind。使用单独的函数,它将两个相同长度的向量(或 data.frame)连接到一个矩阵(或 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

希望能澄清你的理解。

于 2012-11-29T19:32:59.770 回答