我知道在汇总数据后我可以*重新命名列:
blubb <- aggregate(dat$two ~ dat$one, ...)
colnames(blubb) <- c("One", "Two")
没错。但有没有办法一次性聚合和命名列?有点像:
blubb <- aggregate( ... , cols = c("One", "Two"))
以某种方式捕获原始列名称并且确实如此(
)会特别好(并且是错字的)blubb <- aggregate( ... , cols = c(name_of_dat$one, name_of_dat$two."_Mean"))
答案 0 :(得分:66)
您可以使用setNames
,如下所示:
blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))
或者,您可以绕过光滑的公式方法,并使用如下语法:
blubb <- aggregate(list(One = dat$one), list(Two = dat$two), ...)
此更新旨在帮助您开始自行推导解决方案。
如果您检查stats:::aggregate.formula
的代码,您会看到以下几行:
if (is.matrix(mf[[1L]])) {
lhs <- as.data.frame(mf[[1L]])
names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
}
else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
如果您要做的就是将函数名称附加到已聚合的变量,也许您可以将其更改为:
if (is.matrix(mf[[1L]])) {
lhs <- as.data.frame(mf[[1L]])
names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
myOut <- aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
colnames(myOut) <- c(names(mf[-1L]),
paste(names(lhs), deparse(substitute(FUN)), sep = "."))
}
else {
myOut <- aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
colnames(myOut) <- c(names(mf[-1L]),
paste(strsplit(gsub("cbind\\(|\\)|\\s", "",
names(mf[1L])), ",")[[1]],
deparse(substitute(FUN)), sep = "."))
}
myOut
这基本上使用FUN
捕获为deparse(substitute(FUN))
输入的值,因此您可以修改函数以接受自定义后缀,甚至可能是后缀的向量。通过一些工作可能会有所改善,但我不会这样做!
这里应用了这个概念a Gist,创建了一个名为“myAgg”的函数。
以下是一些示例输出,只有结果列名:
> names(myAgg(weight ~ feed, data = chickwts, mean))
[1] "feed" "weight.mean"
> names(myAgg(breaks ~ wool + tension, data = warpbreaks, sum))
[1] "wool" "tension" "breaks.sum"
> names(myAgg(weight ~ feed, data = chickwts, FUN = function(x) mean(x^2)))
[1] "feed" "weight.function(x) mean(x^2)"
请注意,只有聚合变量名称会更改。但请注意,如果你使用自定义函数,你最终会得到一个非常奇怪的列名!
答案 1 :(得分:9)
你的第一个问题的答案是肯定的。您当然可以在聚合函数中包含列名。使用上面示例中的名称:
blubb <- aggregate(dat,list(One=dat$One,Two=dat$Two),sum)
我喜欢自动提取原始列名的部分。如果我搞清楚,我会发布它。
答案 2 :(得分:0)
如果您更喜欢将聚集体写为formula
,则文档中会显示cbind
的用法。并且cbind
允许您命名其参数,aggregate
使用该参数。
blubb <- aggregate(cbind(Two = dat$two) ~ cbind(One = dat$one), ...)
一个以上的列与一个以上的分组因子的汇总可以像这样进行:
blubb <- aggregate(cbind(x = varX, y = varY, varZ) ~ cbind(a = facA) + cbind(b = facB) + facC, data=dat, FUN=sum)
,如果要使用多个功能:
aggregate(cbind(cases=ncases, ncontrols) ~ cbind(alc=alcgp) + tobgp, data = esoph, FUN = function(x) c("mean" = mean(x), "median" = median(x)))
# alc tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1 1 0-9g/day 1.5000000 1.0000000 43.500000 47.000000
#2 2 0-9g/day 5.6666667 4.0000000 29.833333 34.500000
#...
将使用的聚合函数添加到名称中。
但是cbind
用其内部代码替换factors
。为避免这种情况,您可以使用:
with(esoph, aggregate(data.frame(cases=ncases, ncontrols), data.frame(alc=alcgp, tobgp), FUN = function(x) c("mean" = mean(x), "median" = median(x))))
# alc tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1 0-39g/day 0-9g/day 1.5000000 1.0000000 43.500000 47.000000
#2 40-79 0-9g/day 5.6666667 4.0000000 29.833333 34.500000
#...
答案 3 :(得分:-3)
w <- data.frame(Funding<-"Fully Insured",Region="North East",claim_count=rnbinom(1000, 300.503572818, mu= 0.5739467))
x <- data.frame(Funding<-"Fully Insured",Region="South East",claim_count=rnbinom(1000, 1000, mu= 0.70000000))
y <- data.frame(Funding<-"Self Insured",Region="North East",claim_count=rnbinom(1000, 400, mu= 0.80000000))
z <- data.frame(Funding<-"Self Insured",Region="South East",claim_count=rnbinom(1000, 700, mu= 1.70000000))
names(w)<-c("Funding","Region","claim_count")
names(x)<-c("Funding","Region","claim_count")
names(y)<-c("Funding","Region","claim_count")
names(z)<-c("Funding","Region","claim_count")
my_df <- rbind(w,x,y,z)
my_df2<-with(my_df, aggregate(x=claim_count, by=list(Funding,Region), FUN=sum))
colnames(my_df2)<-colnames(my_df)