我正在尝试将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()函数的基础吗?我一直在努力去理解它。致以问候!
发布于 2012-11-29 19:32:59
聚合接受~左侧的所有元素,并在这些值上使用给定的函数,同时根据右侧的值对它们进行分组。因此,你的命令
aggregate(alfa ~ beta, data=x, mean)将返回按alfa分组的平均值。(正如您提到的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))这样,您只需告诉聚合函数在给定函数中使用抛出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的值。
希望能澄清你的理解。
https://stackoverflow.com/questions/13633063
复制相似问题