使用带有变量名称的聚合作为列名

时间:2014-12-01 18:47:12

标签: r dataframe aggregate

我有以下数据框:

a <- c(1,1,4)
b <- c(1,0,2)
c <- data.frame(a=a,b=b)
str(c)
#  a  b
#1 1  1
#2 1  0
#3 4  2

我想以下列方式聚合数据框c:

aggregate(b~a,FUN=mean,data=c)
#  a   b
#1 1 0.5
#2 4 2.0

但是,我的主要问题是我将使用变量作为列的名称

所以:

d <- 'a'

如果我尝试使用包含列名称的变量d进行聚合,我显然会收到错误:

aggregate(b~d,FUN=mean,data=c)
#Error in model.frame.default(formula = b ~ d, data = c) : variable lengths differ (found for 'd')

这有效,但我得到了愚蠢的列名。我想避免重命名列的额外步骤:

aggregate(c[,'b']~c[,d],FUN=mean,data=c)
#  c[, d] c[, "b"]
#1    1      0.5
#2    4      2.0

如何聚合并在第一次尝试时获得正确的列名? (也许没有办法做到这一点)

4 个答案:

答案 0 :(得分:3)

你可以尝试

aggregate(c['b'], c[d], FUN=mean)
#   a   b
# 1 1 0.5
# 2 4 2.0

如果您使用formula方法,另一个选择是使用setNames

 setNames(aggregate(b~get(d), FUN=mean, data=c), colnames(c))
 #  a   b
 #1 1 0.5
 #2 4 2.0

答案 1 :(得分:3)

如果你没有与基地R中的aggregate(...)结合,那么这是一个data.table解决方案。

library(data.table)
setDT(c)[,list(b=mean(b)),by=d,with=TRUE]
#    a   b
# 1: 1 0.5
# 2: 4 2.0

答案 2 :(得分:1)

您可以使用cbindaggregate中设置名称。此方法还显示您可以省略data参数。因此,如果我们使用您的原始计划,您可以

aggregate(cbind(b = c[, "b"]) ~ cbind(a = c[, "a"]), FUN = mean)
#   a   b
# 1 1 0.5
# 2 4 2.0

答案 3 :(得分:1)

我解决这个问题的方法是在paste中构建公式参数:

aggregate(formula(paste0("b ~ ", d)), data = c, FUN = mean)

通过这种方式,您可以根据需要轻松地将同名的变量传递给复杂的公式。