我有22个不同型号预测的150年期间的月度降雨量数据。列看起来像: 年月Model1 Model2 Model3 ..... Model 22
数据如下:
1950 1 75 90 120...67
1950 2 .. .. .. .. ..
1950 (repeat 12 times for 12 months of the year)
1951
...
2099
我有兴趣按模型提取6月到8月的数据,然后查找这3个月的总和。我之前使用过子集特征和融化特征(重塑包)但我不确定如何将两者结合起来。任何帮助,将不胜感激。谢谢, V
答案 0 :(得分:2)
这应该可以帮助您:使用dplyr
。使用akrun的数据
df %>%
filter(Month %in% 6:8) %>%
group_by(Year) %>%
summarise_each(funs(sum),-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
答案 1 :(得分:2)
这是使用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
,借助二进制搜索极大地加速子集操作 - {{3 }}
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))