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

如何按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()

逻辑说明

  1. last_pre12_date列:先给降水量超12mm的行标记对应日期,其余行设为NA;再通过向下回填,让后续每行都能获取到最近一次超12mm的日期,首次出现前的行保持NA。
  2. Days_since12列:
    • 若last_pre12_date为NA(首次超12mm前的日期),结果设为NA;
    • 当日降水量超12mm时,直接记为0;
    • 其余情况计算当前日期与最近一次超12mm日期的整数天数差。

运行代码后得到的结果与期望输出完全匹配。


内容的提问来源于stack exchange,提问作者Amanda Goldberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:23:18