在R中命名聚合中的列

在R中命名聚合中的列,r,rename,aggregate,R,Rename,Aggregate,我知道我可以在聚合数据后*重新*命名列: blubb <- aggregate(dat$two ~ dat$one, ...) colnames(blubb) <- c("One", "Two") blubb您可以使用setNames如下所示: blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two")) 如果您只想将函数名附加到聚合的变量,那么您可以将其更改为: if (is.matrix(mf

我知道我可以在聚合数据后*重新*命名列:

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

blubb您可以使用
setNames
如下所示:

blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))
如果您只想将函数名附加到聚合的变量,那么您可以将其更改为:

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

请注意,只有聚合的变量名更改。但还要注意,如果使用自定义函数,最终将得到一个非常奇怪的列名

第一个问题的答案是肯定的。您当然可以在聚合函数中包含列名。使用上面示例中的名称:


blubb
w如果您喜欢将聚合编写为
公式
,文档将显示
cbind
的用法。而
cbind
允许您命名它的参数,这些参数由
aggregate
使用

aggregate(cbind(SLength = Sepal.Length) ~ cbind(Type = Species),
  data = iris, mean)
#  Type SLength
#1    1   5.006
#2    2   5.936
#3    3   6.588
但是
cbind
因子
替换为它们的内部代码。要避免这种情况,您可以使用:

aggregate(SLength ~ Type, with(iris, data.frame(SLength = Sepal.Length,
  Type = Species)), mean)
#        Type SLength
#1     setosa   5.006
#2 versicolor   5.936
#3  virginica   6.588
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
#...

list
相比,使用
cbind
data.frame
的优势在于并非所有列都需要指定一个(新)名称。通过一个以上的分组因子聚合一个以上的列,如下所示:

aggregate(cbind("Miles/gallon" = mpg, Weight = wt, hp) ~ cbind(Cylinders =
  cyl) + cbind(Carburetors = carb) + gear, data = mtcars, mean)
#   Cylinders Carburetors gear Miles/gallon  Weight    hp
#1          4           1    3        21.50 2.46500  97.0
#2          6           1    3        19.75 3.33750 107.5
#...
如果您想使用多个功能:

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
#...
它将使用的聚合函数添加到colname

Hera再次将
cbind
因素替换为其内部代码。要避免这种情况,您可以使用:

aggregate(SLength ~ Type, with(iris, data.frame(SLength = Sepal.Length,
  Type = Species)), mean)
#        Type SLength
#1     setosa   5.006
#2 versicolor   5.936
#3  virginica   6.588
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
#...

非常感谢。这是否意味着绝对不可能在aggregate()括号内设置列名?另外,我编辑了我的问题,也许你对我问题的后半部分有进一步的想法。我喜欢另一种选择:-)我过一会儿会调查你的问题。同时,看一下aggregate,它将应用于聚合列名的函数追加到aggregate中。我没有在我的答案中发布它,因为它确实在一定程度上限制了聚合的功能,并且是为我正在进行的项目编写的。也可以使用没有列表的名称()
blubb@Matt,(1)这似乎对我不起作用,(2)这对多个分组变量如何起作用,(3)如果您指定
data=dat
(这是
聚合的
公式
方法的参数,而不是您在这里提出的方法),为什么需要
dat$
。如果我遗漏了什么,一定要让我知道。谢谢如何更改函数
sum
产生的列的名称?现在它只是
x
@andrewj我相信你可以把它放在函数的“列表”部分,例如…list(One=dat$One,Two=dat$Two,MyResults=dat$x)。。。
aggregate(SLength ~ Type, with(iris, data.frame(SLength = Sepal.Length,
  Type = Species)), mean)
#        Type SLength
#1     setosa   5.006
#2 versicolor   5.936
#3  virginica   6.588
with(iris, aggregate(data.frame(SLength = Sepal.Length),
  data.frame(Type = Species), mean))
#        Type SLength
#1     setosa   5.006
#2 versicolor   5.936
#3  virginica   6.588
aggregate(data.frame(SLength = iris$Sepal.Length),
  data.frame(Type = iris$Species), mean)
#        Type SLength
#1     setosa   5.006
#2 versicolor   5.936
#3  virginica   6.588
aggregate(cbind("Miles/gallon" = mpg, Weight = wt, hp) ~ cbind(Cylinders =
  cyl) + cbind(Carburetors = carb) + gear, data = mtcars, mean)
#   Cylinders Carburetors gear Miles/gallon  Weight    hp
#1          4           1    3        21.50 2.46500  97.0
#2          6           1    3        19.75 3.33750 107.5
#...
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
#...
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
#...