如何按Pool分组计算距上次降水量超12mm的天数?
分组计算日期距离上次降水量超12mm的天数
问题描述
现有按泳池(Pool)分组的每日降水量(Precip)数据集,需实现以下计算规则:
- 按
Pool分组,计算每个日期距离上次降水量超过12mm的天数; - 当日降水量>12mm时,天数记为0;
- 首次出现降水量>12mm之前的所有日期,天数记为NA。
示例数据构建
Pool <- c("A","A","A","A","A","A","A","A","A","A", "B","B","B","B","B","B","B","B","B","B") DATE <- as.Date(c("2005-01-01","2005-01-02","2005-01-03","2005-01-04","2005-01-05", "2005-01-06","2005-01-07","2005-01-08","2005-01-09","2005-01-10", "2005-01-01","2005-01-02","2005-01-03","2005-01-04","2005-01-05", "2005-01-06","2005-01-07","2005-01-08","2005-01-09","2005-01-10")) Precip <- c(0,0,3,18,4,3,13,8,3,0,13,0,3,13,0,3,10,8,13,0) df <- data.frame(Pool, DATE, Precip)
已完成的标记步骤
已生成标记列pre12,用于标识当日降水量是否超过12mm:
library(dplyr) df2 <- df %>% group_by(Pool) %>% mutate(pre12=ifelse(Precip>12,1,0))
解决方案:计算天数差
通过回填最近一次降水量超12mm的日期,再计算日期差值实现需求:
df_result <- df2 %>% group_by(Pool) %>% # 标记降水量超12mm的日期,其他行设为NA mutate(last_pre12_date = ifelse(pre12 == 1, DATE, NA)) %>% # 向下回填最近的超12mm日期,首次出现前保持NA fill(last_pre12_date, .direction = "down") %>% # 按规则计算天数差 mutate(Days_since12 = case_when( is.na(last_pre12_date) ~ NA_integer_, pre12 == 1 ~ 0L, TRUE ~ as.integer(DATE - last_pre12_date) )) %>% # 移除临时辅助列(可选操作) select(-pre12, -last_pre12_date) %>% ungroup()
逻辑说明
last_pre12_date列:先给降水量超12mm的行标记对应日期,其余行设为NA;再通过向下回填,让后续每行都能获取到最近一次超12mm的日期,首次出现前的行保持NA。Days_since12列:- 若
last_pre12_date为NA(首次超12mm前的日期),结果设为NA; - 当日降水量超12mm时,直接记为0;
- 其余情况计算当前日期与最近一次超12mm日期的整数天数差。
- 若
运行代码后得到的结果与期望输出完全匹配。
内容的提问来源于stack exchange,提问作者Amanda Goldberg
相关产品推荐
相关产品推荐

