R中的数据透视表(提取行特定数据)

时间:2015-01-27 14:21:33

标签: r reshape2 subset

我有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

2 个答案:

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