r - 基于 R 中最高温度的热波计算
问题描述
如果一个气象站的最高温度连续 3 天或以上超过正常温度 3°C 或以上,则定义为热浪。我已经根据多年的每日最高温度数据计算了每日平均值(每日正常值),例如
df <- data.frame("date"= seq(from = as.Date("1970-1-1"), to = as.Date("2000-12-31"), by = "day"),
"MaxT" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 20, 40))
df$day <- format(df$date, format='%m-%d')
daily_mean <- aggregate(MaxT ~ day, data=df, FUN=mean)
现在要与每年的日最高气温相匹配,确定最高气温连续3天以上高于正常日气温3℃以上的日期。这些事件将被视为热浪。我的问题是如何在 R 中实现它?
解决方案
这是一种使用dplyr
andzoo
的方法rollapplyr
。
library(dplyr)
df_out <- df %>%
left_join(daily_mean %>% rename(mean_temp = MaxT), by = 'day') %>%
mutate(is_heatwave = zoo::rollapplyr(MaxT > (mean_temp + 3),
3, all,fill = NA))
热浪的一些实例:
df_out[31:50, ]
# date MaxT day mean_temp is_heatwave
#31 1970-01-31 26.31675 01-31 28.31451 FALSE
#32 1970-02-01 22.05946 02-01 29.83059 FALSE
#33 1970-02-02 34.22469 02-02 29.84562 FALSE
#34 1970-02-03 33.03264 02-03 29.87919 FALSE
#35 1970-02-04 36.62357 02-04 31.50603 TRUE
#36 1970-02-05 29.82134 02-05 30.22581 FALSE
#37 1970-02-06 28.13625 02-06 29.64073 FALSE
#38 1970-02-07 29.95754 02-07 29.54277 FALSE
#39 1970-02-08 21.40026 02-08 30.96619 FALSE
#40 1970-02-09 33.10983 02-09 28.16146 FALSE
#41 1970-02-10 30.87346 02-10 29.37693 FALSE
#42 1970-02-11 31.08721 02-11 28.89930 FALSE
#43 1970-02-12 27.34925 02-12 29.27882 FALSE
#44 1970-02-13 31.88582 02-13 29.35825 FALSE
#45 1970-02-14 30.05155 02-14 28.24995 FALSE
#46 1970-02-15 35.07049 02-15 29.02716 FALSE
#47 1970-02-16 39.49029 02-16 32.75644 FALSE
#48 1970-02-17 37.41917 02-17 31.44022 TRUE
#49 1970-02-18 36.03564 02-18 29.56212 TRUE
#50 1970-02-19 36.48052 02-19 30.18766 TRUE
TRUE
值是存在热浪的地方。正如我们在第 33、34 和 35 行中看到的那样,我们连续 3 天MaxT
大于mean_temp
3 度以上。同样,我们可以验证其他日子。
要获得每年的热浪事件,我们可以这样做:
df_year <- df_out %>%
group_by(year = format(date, "%Y")) %>%
summarise(total_heat = with(rle(is_heatwave),
sum(values, na.rm = TRUE)))
并sum(df_year$total_heat)
会给出总体计数。
推荐阅读
- kubernetes - 集群内无法访问 Kubernetes POD
- c# - 如何在将照片添加到数据库之前显示照片的预览?
- javascript - 如何在 JavaScript 中向 HH:MM:SS 添加分钟数?
- javascript - 每次单击开关时都需要创建一个新对象,并在关闭时将其删除
- python - Python NameError:未定义名称'N'
- scala - 模拟演员及其在单元测试中的响应
- python - 获取所有行值给定一个单元格被选中 QTableView
- r - r中如何进行模糊匹配?
- python - 使用 Python 反向搜索 Yandex 图像中的图像
- r - 如何在 R 中使用 ggplot 绘制多个物种的平均 CPUE