考虑虚拟数据:
head(df)
group v1 v2 v3
1 3 9 7
1 4 7 6
2 10 9 1
2 12 2 2
2 15 9 10
我需要为每个组计算每列(v1,v2,v3)的平均值。
我尝试使用by()和colMeans(),它的作用如下:
mean.df = by(df[,2:4],df$group,colMeans)
它工作正常,但我需要依赖于我想要应用于我的数据的任何函数的“列版本”的存在。例如,当我需要计算标准偏差或间隔范围(IQR)时,没有colSds或colIQR函数,因此只更换colMeans不起作用。
我可以使用“for”循环,但是我想尝试没有循环,例如:
mean.df = data.frame(group = 1:2)
for (i in 2:ncol(df)) {
mean.df[,i] = tapply(df[,i],df$group,mean)
}
这样我就可以插入任何描述性统计功能,并返回所需的输出:
> mean.df
group V2 V3 V4
1 1 3.50000 8.000000 6.500000
2 2 12.33333 6.666667 4.333333
有没有更好的方法可以在不使用循环或依赖列式功能的情况下执行此操作?
提前致谢
答案 0 :(得分:3)
函数aggregate
可用于根据分组变量将函数应用于多个列:
> aggregate(. ~ group, df, mean)
group v1 v2 v3
1 1 3.50000 8.000000 6.500000
2 2 12.33333 6.666667 4.333333
> aggregate(. ~ group, df, sd)
group v1 v2 v3
1 1 0.7071068 1.414214 0.7071068
2 2 2.5166115 4.041452 4.9328829
> aggregate(. ~ group, df, IQR)
group v1 v2 v3
1 1 0.5 1.0 0.5
2 2 2.5 3.5 4.5
另一个选项是data.table
包:
> library(data.table)
> DT <- as.data.table(df)
> DT[ , lapply(.SD, mean), by = group]
group v1 v2 v3
1: 1 3.50000 8.000000 6.500000
2: 2 12.33333 6.666667 4.333333