我有以下数据框:
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
如何聚合并在第一次尝试时获得正确的列名? (也许没有办法做到这一点)
答案 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)
您可以使用cbind
在aggregate
中设置名称。此方法还显示您可以省略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)
通过这种方式,您可以根据需要轻松地将同名的变量传递给复杂的公式。