使用汇总平均数百列?

Average over hundreds of columns with summarize?

我有一个数据集,其中包含一系列 ID 和活动,以及针对每个 ID 和 activity 组合的一堆观察列。我想取每次观察的平均值,但由于有成百上千的观察,我不清楚如何进行。

示例数据:

id,activity,obs1,obs2,obs3
1,1,325,6432,5432
1,2,321,214,2143
1,3,3652,123,123
2,1,5321,123,643
2,2,4312,4321,432
2,3,522,123,321
1,1,532,765,8976
1,2,142,865,5445
1,3,643,654,53
2,1,756,765,7865
2,2,876,654,976
2,3,6754,765,987

到目前为止我尝试过的:

library(dplyr)
example <- read.table("clipboard",sep=",",header=T)
group <- group_by(example,id,activity)
summarize(group, mobs1=mean(obs1), mobs2=mean(obs2), mobs3=mean(obs3))

这让我找到了正确的形式,但是我如何在不输入 mobsN=mean(obsN) 数百次的情况下完成 summarize()?我觉得这里会有一个应用函数,但我不确定是哪个...

这应该会给你想要的结果:

library(dplyr)
means.wide <- example %>% 
  group_by(id,activity) %>% 
  summarise_each(funs(mean))

你也可以把example转成长格式然后计算均值:

library(dplyr)
library(tidyr)

means.long <- example %>% 
  gather(obs, val, -c(id,activity)) %>% 
  group_by(id,activity,obs) %>% 
  summarise(mean_val=mean(val))

您也可以使用 data.table 包来做到这一点:

# compareble to the wide dplyr version
library(data.table)
setDT(example)[, lapply(.SD, mean), by=list(id,activity)]

# compareble to the long dplyr version
library(data.table)
melt(setDT(example),id.vars=c("id","activity"))[, mean(value), by=list(id,activity,variable)]

并且不要忘记旧的 base R:

aggregate(. ~ id + activity, example, FUN = mean)