我有以下数据框
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环境。