使用聚合在一个调用中对几个变量应用几个函数

前端之家收集整理的这篇文章主要介绍了使用聚合在一个调用中对几个变量应用几个函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下数据框
x <- read.table(text = "  id1 id2 val1 val2
1   a   x    1    9
2   a   x    2    4
3   a   y    3    5
4   a   y    4    9
5   b   x    1    7
6   b   y    4    4
7   b   x    3    9
8   b   y    2    8",header = TRUE)

我想计算由id1和id2分组的val1和val2的平均值,同时计算每个id1-id2组合的行数。我可以单独执行每个计算:

# calculate mean
aggregate(. ~ id1 + id2,data = x,FUN = mean)

# count rows
aggregate(. ~ id1 + id2,FUN = length)

为了做一次电话中的两个计算,我试过

do.call("rbind",aggregate(. ~ id1 + id2,FUN = function(x) data.frame(m = mean(x),n = length(x))))

但是,我得到一个乱码输出和警告:

#     m   n
# id1 1   2
# id2 1   1
#     1.5 2
#     2   2
#     3.5 2
#     3   2
#     6.5 2
#     8   2
#     7   2
#     6   2
# Warning message:
#   In rbind(id1 = c(1L,2L,1L,2L),id2 = c(1L,val1 = list( :
#   number of columns of result is not a multiple of vector length (arg 1)

我可以使用plyr包,但我的数据集是相当大,plyr是非常慢(几乎不可用)当数据集的大小增长。

如何使用聚合在一个调用中执行几个计算?

你可以一步一步做到这一切,并得到适当的标签
> aggregate(. ~ id1+id2,FUN = function(x) c(mn = mean(x),n = length(x) ) )
#   id1 id2 val1.mn val1.n val2.mn val2.n
# 1   a   x     1.5    2.0     6.5    2.0
# 2   b   x     2.0    2.0     8.0    2.0
# 3   a   y     3.5    2.0     7.0    2.0
# 4   b   y     3.0    2.0     6.0    2.0

这是LHS上多个变量的语法:

aggregate(cbind(val1,val2) ~ id1 + id2,n = length(x) ) )

更新:(不是真的,更多的评论和一个错误)

因为有一个错误? (2013-08-08)在聚合中,您不能在data.frame类的对象中保存aggregate(data.frame)的输出
要获得正确的结果,您必须:

object <- as.data.frame(as.list(aggregate(data.frame)))

作者回复“更新”上面“

我发现没有这样的错误(如下所述@ user2659402)。我在MacOS 10.7.5上运行最新版本的R。我发现上面的代码完全不必要,因为聚合返回的对象类是“data.frame”。如果编辑在基本R函数中声明了错误,那么它们应该伴随有足够的数据文档,以及“正确结果”真正意味着与R版本和操作系统观察到的行为。

10/27/2014:我还没有发现这样的行为。我目前在Mac上运行R 3.1.1在Yosemite下,我测试了(再次)与Mac GUI和RStudio版本0.98.1081环境。

猜你在找的设计模式相关文章