【发布时间】:2021-10-12 06:22:14
【问题描述】:
我想使用dplyr计算以下条件
a) 当正常最低温度等于 10°C 或更高时。
寒潮:偏离正常为 -5°C 至 -6°C。
严重寒潮:偏离正常为 -7°C 或更低
b) 正常最低温度低于 10°C 时。
寒潮:偏离正常为 -4°C 至 -5°C。
严重寒潮:偏离正常为 -6°C 或更低。
我正在使用以下代码
library(tidyverse)
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")), 8, 28))
#Calculation of normal minimum temperature
df_summarise_all <- df %>%
as_tibble() %>% # for easier viewing
mutate(day = format(as.Date(df$Date, format='%Y-%m-%d'), format='%m-%d')) %>%
group_by(day) %>%
summarise_all(list(mean)) %>%
pivot_longer(cols = -c(Date, day), names_to = "variable", values_to = "value")
#Identification of days fulfilling the condition for cold wave
df_out <- df %>%
as_tibble() %>% # for easier viewing
mutate(day = format(as.Date(df$Date, format='%Y-%m-%d'), format='%m-%d')) %>%
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 < (ifelse(mean_MinT < 10, mean_MinT - 4, mean_MinT - 5)),
1, all, fill = NA))
我无法实现 -5°C 到 -6°C 和 -4°C 到 -5°C 的条件。如何使用dplyr 实现这一点?
【问题讨论】:
-
1.正常最低温度是多少? 2. 如果您提供一小部分数据并显示其预期输出,则更容易理解问题。 3. 我不清楚你为什么在这里使用
zoo::rollapplyr。 -
1.正常最低温度是多年每日最低温度数据的每日平均值。 2. 当条件满足时,它应该返回 TRUE,否则返回 FALSE。 3. 我从您的previous answer 中使用过它。
-
您能否再解释一下您期望获得的数据子集的结果是什么?当我运行代码时,小于
mean_MinT所需数量的minT值被标记为TRUE,所有其他值都是FALSE,根据描述,这似乎是正确的。 -
@Tjn25 我无法实现 -5°C 到 -6°C 和 -4°C 到 -5°C 的条件。我可以将条件应用为
mean_MinT - 4, mean_MinT - 5,但是-6 和-5 呢? -
我对所提供问题的解释是 -6C 或更低的偏离是严重的,但如果它们至少是 -4(包括 -4.0 到 -4.999),那只是一个寒潮。所以嵌套的 ifelse 只需要与 mean_MinT - 4 进行比较。