这是使用data.table的一种方式:
library(data.table)
setDT(df)[Month %in% 6:8, lapply(.SD, sum), by=Year, .SDcols= -"Month"]
# Year Model1 Model2 Model3
#1: 1950 1.3107384 -0.3295989 -1.521790
#2: 1951 -3.7768090 1.0092107 1.737716
#3: 1952 0.5202926 2.6768969 1.890024
我们获得Month 为6、7 或8 的行索引,并在该子集上计算除Month(在.SDcols 中指定)之外的所有列的平均值,同时按Year 分组。
此外,我们还可以在 data.table 上setkey,在二分搜索的帮助下极大地加快 子集 操作 - see vignettes。
setkey(setDT(df), Month) ## reorders `df` by `Month`
df[J(6:8), lapply(.SD, sum), by=Year, .SDcols= -"Month"]
请注意,只有第一部分从 Month %in% 6:8 更改为 J(6:8)。后者在键列Month 上执行基于二分搜索的子集。其他一切都完好无损。
如果您进行重复的子集化或使用非常大的数据集,使用二分搜索键控 data.tables 和子集化将极大地提高性能。有关详细信息,请参阅小插曲。
数据
set.seed(42)
df <- data.frame(Year= rep(1950:1952,each=12), Month=rep(1:12,3),
Model1=rnorm(36), Model2=rnorm(36), Model3=rnorm(36))