在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
请注意,只有聚合的变量名更改。但还要注意,如果使用自定义函数,最终将得到一个非常奇怪的列名 第一个问题的答案是肯定的。您当然可以在聚合函数中包含列名。使用上面示例中的名称:
blubbw如果您喜欢将聚合编写为公式
,文档将显示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
#...