如果气象站的最低温度连续3天或更长时间低于正常温度3°C或更高,则定义为寒潮。我已经尝试使用以下代码计算多个站点
#Calculation for multistation
set.seed(123)
df <- data.frame("date"= seq(from = as.Date("1970-1-1"), to = as.Date("2000-12-31"), by = "day"),
"Station1" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 10, 30),
"Station2" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 11, 29),
"Station3" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 9, 28))
head(df)
df$day <- format(df$date, format='%m-%d')
#Daily average (daily normal) calculation
df_summarise_all <- df %>%
as_tibble() %>% # for easier viewing
mutate(day = format(df$date, format='%m-%d')) %>%
group_by(day) %>%
summarise_all(funs(mean)) %>%
pivot_longer(cols = -c(date, day), names_to = "variable", values_to = "value")
#Coldwave event calculation
df %>%
as_tibble() %>% # for easier viewing
pivot_longer(cols = -c(date, day), names_to = "Stations", values_to = "MinT") %>%
left_join(df_summarise_all %>% rename(mean_MinT = value), by = 'day') %>%
mutate(is_coldwave = zoo::rollapplyr(MinT < (mean_MinT - 3),
3, all,fill = NA))
从输出中可以看出,日正常温度和站点最低温度的结合是不正确的。我有三个问题
- 如何更正联接
- 如何获得每个车站每年的冷柜数量?以及
- 如何获得每个站点的总体冷波计数
您也应该通过Stations
加入,并可能与mean_MinT - 3
进行coldwave比较。
library(dplyr)
df_out <- df %>%
tidyr::pivot_longer(cols = -c(date, day),
names_to = "Stations", values_to = "MinT") %>%
left_join(df_summarise_all %>% rename(mean_MinT = value),
by = c('day' = 'day', 'Stations' = 'variable')) %>%
mutate(is_coldwave = zoo::rollapplyr(MinT < (mean_MinT - 3), 3,
all,fill = NA))
要计算每年和总冷量,您可以使用与此答案中相同的方法。
df_year <- df_out %>%
group_by(Stations, year = format(date.x, "%Y")) %>%
summarise(total_cold = with(rle(is_coldwave),
sum(values, na.rm = TRUE)))
并且CCD_ 3将给出总计数。