Число лет с дождливыми днями в диапазоне 81–119% долгосрочного среднего - PullRequest
0 голосов
/ 11 апреля 2020

День с осадками> = 2,5 мм называется дождливым днем. Я мог рассчитывать месячные дождливые дни, используя следующий код

library(seas)
library(tidyverse)
library(zoo)
library(lubridate)

data(mscdata)
dat.int <- (mksub(mscdata, id=1108447))

dat.int %>% 
  as_tibble() %>% # for easier viewing 
  mutate(yearmon = as.yearmon(dat.int$date, "%b %y")) %>% 
  dplyr::select(-date, -year, -yday, -t_max, -t_min, -t_mean) %>% 
  pivot_longer(cols = -yearmon, names_to = "variable", values_to = "value") %>% 
  group_by(yearmon, variable) %>% 
  summarise(rainy_days = sum(value > 2.5)) %>% 
  pivot_wider(names_from = "variable", values_from = "rainy_days")

Затем я рассчитал долгосрочное среднее значение, используя следующий код

dat.int %>% 
  as_tibble() %>% # for easier viewing 
  mutate(yearmon = as.yearmon(dat.int$date, "%b %y")) %>% 
  dplyr::select(-date, -year, -yday, -t_max, -t_min, -t_mean) %>% 
  pivot_longer(cols = -yearmon, names_to = "variable", values_to = "value") %>% 
  group_by(yearmon, variable) %>% 
  summarise(rainy_days = sum(value > 2.5)) %>% 
  mutate(year = year(yearmon)) %>%
  group_by(variable) %>% 
  summarize(value = as.integer(round(mean(rainy_days, na.rm = T)))) %>% 
  pivot_wider(names_from = "variable", values_from = "value")

Теперь два порога должны быть рассчитаны как: ниже порог = 0,81 * долгосрочное среднее и верхний порог = 1,19 * долгосрочное среднее. Затем вычислите количество лет с дождливыми днями между этими двумя пороговыми значениями. Теперь я хочу вычислить количество лет с дождливыми днями в диапазоне 81–119% долгосрочного среднего (между нижним и верхним порогом).

1 Ответ

1 голос
/ 11 апреля 2020

Редактировать: на основе комментариев ОП и желания суммировать по общему количеству осадков, дождя и снега.

library(dplyr)
library(lubridate)
dat.int %>%
  mutate(month = month(ymd(date))) %>%
  group_by(year, month) %>% 
  summarize_at(vars(precip,rain,snow), funs(days = sum(. >= 2.5,na.rm = TRUE))) %>%
  group_by(year) %>%
  summarize_at(vars(ends_with("days")), funs(yearly = sum(.))) %>%
  summarize_at(vars(-year), list(~ sum(. > mean(.) * 0.81 & . < mean(.) * 1.19))) %>%
  rename_all(list(~ gsub("days_yearly","in_range",.)))  summarize(years = n())
#  precip_in_range rain_in_range snow_in_range
#            <int>         <int>         <int>
#1              26            24             6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...