如何在 R 中聚合时显示变量名
how to show the variable name while aggregate in R
我想知道当我进行如下聚合时是否有任何参数设置,结果将显示原始列名称而不是通用 "group.1"
data1 <- aggregate(mtcars[1:4], list(mtcars$am, mtcars$gear),mean)
data1
Group.1 Group.2 mpg cyl disp hp
1 0 3 16.10667 7.466667 326.3000 176.1333
2 0 4 21.05000 5.000000 155.6750 100.7500
3 1 4 26.27500 4.500000 106.6875 83.8750
4 1 5 21.38000 6.000000 202.4800 195.6000
非常感谢,
顺便说一句,我知道 reshape 中的函数名称(x)。
可以试试公式的方法
aggregate(cbind(mpg,cyl,disp,hp)~am+gear, mtcars, mean)
# am gear mpg cyl disp hp
#1 0 3 16.10667 7.466667 326.3000 176.1333
#2 0 4 21.05000 5.000000 155.6750 100.7500
#3 1 4 26.27500 4.500000 106.6875 83.8750
#4 1 5 21.38000 6.000000 202.4800 195.6000
或在列表中重命名
aggregate(mtcars[1:4], list(am=mtcars$am, gear=mtcars$gear),mean)
# am gear mpg cyl disp hp
#1 0 3 16.10667 7.466667 326.3000 176.1333
#2 0 4 21.05000 5.000000 155.6750 100.7500
#3 1 4 26.27500 4.500000 106.6875 83.8750
#4 1 5 21.38000 6.000000 202.4800 195.6000
如果名字很多,就用setNames
aggregate(mtcars[1:4], setNames(list(mtcars$am, mtcars$gear),
names(mtcars)[9:10]),mean)
如果您决定使用 dplyr/data.table/sqldf
,则等效代码为
library(dplyr)
mtcars %>%
group_by(am, gear) %>%
summarise_each(funs(mean), 1:4)
使用data.table
library(data.table)#v1.9.5+
as.data.table(mtcars)[, lapply(.SD, mean), by=.(am, gear), .SDcols=1:4]
使用sqldf
library(sqldf)
nm1 <- toString(sprintf("avg(%s) as %s",
names(mtcars)[1:4], names(mtcars)[1:4]))
fn$sqldf("select am, gear, $nm1 from mtcars group by am, gear")
因为数据框也是一个列表,所以使用数据框作为第二个参数:
aggregate(mtcars[1:4], mtcars[c("am", "gear")], mean)
给予:
am gear mpg cyl disp hp
1 0 3 16.10667 7.466667 326.3000 176.1333
2 0 4 21.05000 5.000000 155.6750 100.7500
3 1 4 26.27500 4.500000 106.6875 83.8750
4 1 5 21.38000 6.000000 202.4800 195.6000
我想知道当我进行如下聚合时是否有任何参数设置,结果将显示原始列名称而不是通用 "group.1"
data1 <- aggregate(mtcars[1:4], list(mtcars$am, mtcars$gear),mean)
data1
Group.1 Group.2 mpg cyl disp hp
1 0 3 16.10667 7.466667 326.3000 176.1333
2 0 4 21.05000 5.000000 155.6750 100.7500
3 1 4 26.27500 4.500000 106.6875 83.8750
4 1 5 21.38000 6.000000 202.4800 195.6000
非常感谢,
顺便说一句,我知道 reshape 中的函数名称(x)。
可以试试公式的方法
aggregate(cbind(mpg,cyl,disp,hp)~am+gear, mtcars, mean)
# am gear mpg cyl disp hp
#1 0 3 16.10667 7.466667 326.3000 176.1333
#2 0 4 21.05000 5.000000 155.6750 100.7500
#3 1 4 26.27500 4.500000 106.6875 83.8750
#4 1 5 21.38000 6.000000 202.4800 195.6000
或在列表中重命名
aggregate(mtcars[1:4], list(am=mtcars$am, gear=mtcars$gear),mean)
# am gear mpg cyl disp hp
#1 0 3 16.10667 7.466667 326.3000 176.1333
#2 0 4 21.05000 5.000000 155.6750 100.7500
#3 1 4 26.27500 4.500000 106.6875 83.8750
#4 1 5 21.38000 6.000000 202.4800 195.6000
如果名字很多,就用setNames
aggregate(mtcars[1:4], setNames(list(mtcars$am, mtcars$gear),
names(mtcars)[9:10]),mean)
如果您决定使用 dplyr/data.table/sqldf
,则等效代码为
library(dplyr)
mtcars %>%
group_by(am, gear) %>%
summarise_each(funs(mean), 1:4)
使用data.table
library(data.table)#v1.9.5+
as.data.table(mtcars)[, lapply(.SD, mean), by=.(am, gear), .SDcols=1:4]
使用sqldf
library(sqldf)
nm1 <- toString(sprintf("avg(%s) as %s",
names(mtcars)[1:4], names(mtcars)[1:4]))
fn$sqldf("select am, gear, $nm1 from mtcars group by am, gear")
因为数据框也是一个列表,所以使用数据框作为第二个参数:
aggregate(mtcars[1:4], mtcars[c("am", "gear")], mean)
给予:
am gear mpg cyl disp hp
1 0 3 16.10667 7.466667 326.3000 176.1333
2 0 4 21.05000 5.000000 155.6750 100.7500
3 1 4 26.27500 4.500000 106.6875 83.8750
4 1 5 21.38000 6.000000 202.4800 195.6000