具有多个列和多个类别的描述性统计信息

时间:2014-02-25 20:18:24

标签: r optimization multiple-columns

考虑虚拟数据:

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

有没有更好的方法可以在不使用循环或依赖列式功能的情况下执行此操作?

提前致谢

1 个答案:

答案 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