【问题标题】:Using a nested lookup table to find values above thresholds in second table and quantify them in R使用嵌套查找表在第二个表中查找高于阈值的值并在 R 中量化它们
【发布时间】:2021-02-11 10:42:10
【问题描述】:

我正在使用 R 语言分析河流流量数据,我有两个嵌套列表。首先保存来自不同河流河段的数据(Flowtest),称为数字,例如 910、950、1012 和 1087。我每天有数百个流量测量值(Flow),但是当我准备年度统计数据时,确切的日期和月份并不重要.在 Flowtest 表中,每个测量值 (Flow) 都引用了一年 (Year)。

Flowtest <- list("910" = tibble(Year = c(2004, 2004, 2005, 2005, 2007, 2008, 2008), Flow=c(123, 170, 187, 245, 679, 870, 820)),
                 "950" = tibble(Year = c(2004, 2005, 2005, 2005, 2006, 2008, 2008), Flow=c(570, 450, 780, 650, 230, 470, 340)),
                 "1012" = tibble(Year = c(2005, 2005, 2005, 2005, 2007, 2008, 2008), Flow=c(160, 170, 670, 780, 350, 840, 850)),
                 "1087" = tibble(Year = c(2004, 2005, 2005, 2007, 2007, 2008, 2008), Flow=c(120, 780, 820, 580, 870, 870, 840)))

名为 RCHtest 的第二个嵌套表用作查找表。我在与 Flowtest 不同的流量数据集上计算了 0.75% 百分位数 (Q3) 的值(所以我不想使用为 Flowtest 计算的 Q3)。因此,对于每个分析年份(年份),我都有一个 0.75% 百分位阈值(Q3)的值。在 Flowtest 和 RCHtest 中分析的年份和河流范围相同。

RCHtest <- list("910" = data.frame(Year = c(2004:2008), Q3=c(650, 720, 550, 580, 800)),
                "950" = data.frame(Year = c(2004:2008), Q3=c(550, 770, 520, 540, 790)),
                "1012" = data.frame(Year = c(2004:2008), Q3=c(600, 780, 500, 570, 800)),
                "1087" = data.frame(Year = c(2004:2008), Q3=c(670, 790, 510, 560, 780)))

我想获得的是来自 Flowtest$Flow 的值的数量,这些值低于 RCHtest$Q3 每年指定的阈值,每个子流域如下面的 Resulttest 所示。

Resulttest <- list("910" = data.frame(Year = c(2004:2008), aboveQ3=c(0, 0, 0, 1, 2)),
                  "950" = data.frame(Year = c(2004:2008), aboveQ3=c(1, 1, 0, 0, 0)),
                  "1012" = data.frame(Year = c(2004:2008), aboveQ3=c(0, 2, 0, 0, 2)),
                  "1087" = data.frame(Year = c(2004:2008), aboveQ3=c(0, 1, 0, 2, 2)))

如何解决这个问题? 请帮忙

【问题讨论】:

    标签: r loops nested quantile


    【解决方案1】:

    您可以将Mapaggregate 结合使用:

    Map(function(x, y) aggregate(Flow > Q3~Year, merge(x, y, all = TRUE,
              na.action = 'na.pass'), sum, na.rm = TRUE, na.action = 'na.pass'), 
              Flowtest, RCHtest)
    

    这会返回:

    #$`910`
    #  Year Flow > Q3
    #1 2004         0
    #2 2005         0
    #3 2006         0
    #4 2007         1
    #5 2008         2
    
    #$`950`
    #  Year Flow > Q3
    #1 2004         1
    #2 2005         1
    #3 2006         0
    #4 2007         0
    #5 2008         0
    
    #$`1012`
    #  Year Flow > Q3
    #1 2004         0
    #2 2005         0
    #3 2006         0
    #4 2007         0
    #5 2008         2
    
    #$`1087`
    #  Year Flow > Q3
    #1 2004         0
    #2 2005         1
    #3 2006         0
    #4 2007         2
    #5 2008         2
    

    如果你想使用tidyverse 函数来做到这一点,你可以这样做:

    library(dplyr)
    library(purrr)
    
    map2(Flowtest, RCHtest, ~full_join(.x, .y) %>%
                              group_by(Year) %>%
                              summarise(sum = sum(Flow > Q3, na.rm = TRUE)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2014-08-03
      • 2018-03-14
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      相关资源
      最近更新 更多