使用汇总平均数百列?
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)
我有一个数据集,其中包含一系列 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)