R中骨料内的名称列(Name columns within aggregate in R)

2019-07-21 06:06发布

我知道我可以重新* *名字列在我汇总数据:

blubb <- aggregate(dat$two ~ dat$one, ...)
colnames(blubb) <- c("One", "Two")

没有错。 但有一气呵成聚集和命名列的方式吗? 有点像:

blubb <- aggregate( ... , cols = c("One", "Two"))

这将是escpecially不错(和错字证明)以某种方式捕捉原始列名和不喜欢:

blubb <- aggregate( ... , cols = c(name_of_dat$one, name_of_dat$two."_Mean"))

Answer 1:

您可以使用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))所以你可能可以修改函数接受一个自定义的后缀,或者甚至后缀的载体。 这大概可以提高一点与一些工作,但我不打算这样做!

这里是一个要义这个概念应用,创建一个名为“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)"

请注意,只有聚集变量名的变化。 但也注意到,如果您使用自定义功能,你会用很奇怪的列名结束了!



Answer 2:

回答你的第一个问题是肯定的。 你当然可以包括在聚合函数中的列名。 使用从你上面的例子的名字:

blubb <- aggregate(dat,list(One=dat$One,Two=dat$Two),sum)

我喜欢有可能在原来的列名自动拉动的部分。 如果我弄明白我会后它。



Answer 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)


文章来源: Name columns within aggregate in R