R语言计算降雨指数技术求助:滑动窗口等指标实现
降雨指数计算解决方案
先确认基础数据构建(与你提供的代码一致):
year <- c(rep(2000, 360), rep(2001, 360)) day <- rep(1:360, 2) rainfall <- rpois(360*2, 0:100) df5 <- data.frame(year, day, rainfall)
下面逐个解决四个需求:
1. 最大5日连续滑动降水量(R5d)
使用slider包的滑动窗口求和函数,按年份分组计算所有连续5天的降水和,再取最大值:
library(dplyr) library(slider) r5d_result <- df5 %>% group_by(year) %>% mutate(rolling_5d = slide_sum(rainfall, .before = 4, .complete = TRUE)) %>% # .before=4表示包含当前行共5行 summarise(max_r5d = max(rolling_5d, na.rm = TRUE)) print(r5d_result)
- 说明:
.complete = TRUE仅计算完整的5天窗口(前4天会生成NA,用na.rm=TRUE忽略);若需包含不完整窗口(如第1-4天的求和),可设为FALSE。
2. 最大连续降雨天数(降水量>0mm)
通过标记降雨日、生成连续分组,再统计每组长度的最大值:
# 方法1:用data.table的rleid(简洁高效) library(data.table) setDT(df5) max_rain_days <- df5[, .(max_cont_rain = max(rle(rainfall > 0)$lengths[rle(rainfall > 0)$values])), by = year] # 方法2:纯dplyr实现 max_rain_days_dplyr <- df5 %>% group_by(year) %>% mutate(rain_flag = as.integer(rainfall > 0), group_id = cumsum(rain_flag != lag(rain_flag, default = 0))) %>% filter(rain_flag == 1) %>% group_by(year, group_id) %>% summarise(length = n()) %>% summarise(max_cont_rain = max(length, na.rm = TRUE)) print(max_rain_days)
3. 最大连续无降雨天数(降水量=0mm)
逻辑与连续降雨天数一致,仅标记条件改为rainfall == 0:
# data.table方法 max_no_rain_days <- df5[, .(max_cont_norain = max(rle(rainfall == 0)$lengths[rle(rainfall == 0)$values])), by = year] # dplyr方法 max_no_rain_days_dplyr <- df5 %>% group_by(year) %>% mutate(norain_flag = as.integer(rainfall == 0), group_id = cumsum(norain_flag != lag(norain_flag, default = 0))) %>% filter(norain_flag == 1) %>% group_by(year, group_id) %>% summarise(length = n()) %>% summarise(max_cont_norain = max(length, na.rm = TRUE)) print(max_no_rain_days)
4. 年总降水量中高于95百分位的总量
按年份分组计算降水的95百分位阈值,再筛选高于阈值的降水求和:
high_percent_sum <- df5 %>% group_by(year) %>% mutate(p95 = quantile(rainfall, 0.95, na.rm = TRUE)) %>% filter(rainfall > p95) %>% summarise(total_above_p95 = sum(rainfall)) print(high_percent_sum)
- 说明:若需包含等于95百分位的值,将
rainfall > p95改为rainfall >= p95即可。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

