【问题标题】:Pivot table (extracting row-specific data) in RR中的数据透视表(提取特定于行的数据)
【发布时间】:2015-01-27 14:21:33
【问题描述】:

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

【问题讨论】:

    标签: r reshape2 subset


    【解决方案1】:

    这是使用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.tablesetkey,在二分搜索的帮助下极大地加快 子集 操作 - 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))
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 使用summarise_each(funs(sum), -Month)会不会更紧凑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多