使用嵌套查找 table 在秒 table 中查找高于阈值的值并在 R 中对其进行量化
Using a nested lookup table to find values above thresholds in second table and quantify them in R
我正在用 R 语言分析河流流量数据,我有两个嵌套列表。首先保存来自不同河流河段的数据(流量测试),例如 910、950、1012 和 1087。我每天有数百个流量测量值(流量),但是当我准备年度统计数据时,确切的日期和月份并不重要.在 Flowtest table.
中,每个测量值 (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 的第二个嵌套 table 用作查找 table。我在与 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 <- 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)))
如何解决这个问题?
请帮忙
您可以使用 Map
和 aggregate
的组合:
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)
这个returns:
#$`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)))
我正在用 R 语言分析河流流量数据,我有两个嵌套列表。首先保存来自不同河流河段的数据(流量测试),例如 910、950、1012 和 1087。我每天有数百个流量测量值(流量),但是当我准备年度统计数据时,确切的日期和月份并不重要.在 Flowtest table.
中,每个测量值 (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 的第二个嵌套 table 用作查找 table。我在与 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 <- 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)))
如何解决这个问题? 请帮忙
您可以使用 Map
和 aggregate
的组合:
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)
这个returns:
#$`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)))