You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:12:32