在列表列表中使用带有多个函数的ddply

时间:2014-04-10 07:18:55

标签: r aggregate plyr

我有一个带变量的数据框,以及要汇总的多个变量,但是由不同的函数组成。

d <- data.frame(year=c(rep(2011,5), rep(2012,5)),
            v1 = sample(1:10, 10),
            v2 = sample(1:10, 10),
            v3 = sample(1:10, 10),
            v4 = sample(1:10, 10)
            )
d

#     year v1 v2 v3 v4
# 1  2011  1  7  1  3
# 2  2011  6  3  2 10
# 3  2011  7  9  5  8
# 4  2011 10  8  6  9
# 5  2011  3  2  8  4
# 6  2012  9  5  7  6
# 7  2012  2  6  9  5
# 8  2012  4  1  4  7
# 9  2012  5  4  3  1
# 10 2012  8 10 10  2

现在,v1和v2需要通过sum聚合,v3和v4通过均值聚合。如果这些变量名明确地作为文字可用,那么带汇总的ddply效果很好,如:

library(plyr)

ddply(d, "year", summarize, a1=sum(v1), a2=sum(v2), a3=mean(v3), a4=mean(v4))
#   year a1 a2  a3  a4
# 1 2011 27 29 4.4 6.8
# 2 2012 28 26 6.6 4.2

但是,对我来说,这两列列仅作为向量提供。即:

cols1 <- c("v1", "v2")
cols2 <- c("v3", "v4")
# cols1 and cols2 are dynamically generated at runtime.
# v1,v2,v3,v4 are not directly available.

我试图通过这两种方法实现聚合,但都不起作用:

# ddply without summarize
ddply(d, "year", function(x) cbind(colSums(x[cols1]), colMeans(x[cols2])))
# weird output!

# ddply with summarize
ddply(d, "year", summarize, colSums(cols1), colMeans(cols2))
#Error in colSums(cols1) : 'x' must be an array of at least two dimensions

如果最好的方法不使用ddply (aggregate,也许),那就完全可以了。

我现在最好的解决方法是分别进行两个聚合,然后使用聚合副变量合并两个数据框。

0 个答案:

没有答案