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

如何在多站点时间序列数据中定位最大值再次出现的日期

修正R代码:标记站点时间序列中最大值的复现位置

需求说明

处理包含22个站点的时间序列数据框,目标是定位每个站点首个最大值出现后,再次达到该最大值的日期,生成标记列maxDate2(值为1表示该位置是最大值复现点,其余为0)。

数据框字段说明:

  • loc:站点ID(因子类型)
  • DateTime:日期时间(POSIXct类型)
  • mAODscale:时间序列数据列
  • maxDate:已存在的标记列(值为1代表该站点最大值的首次出现位置,其余为NA)

现有问题代码

以下代码尝试移除首个maxDate前的数据并标记maxDate2,但标记结果与目标位置不符:

maxval2 <- scaleDrought %>%
  group_by(loc) %>% 
  slice(which.max(maxDate==1) : n()) %>%
  mutate(maxDate2 = if_else((maxDate != 1 & mAODscale == max(mAODscale)), 1, 0)) %>% 
  ungroup() 

修正后的代码

maxval2 <- scaleDrought %>%
  group_by(loc) %>%
  # 提取每个站点首次最大值的数值及对应行索引
  mutate(first_max_val = mAODscale[maxDate == 1][1],
         first_max_idx = which.max(maxDate == 1)) %>%
  # 标记首次最大值之后的复现位置
  mutate(maxDate2 = if_else(row_number() > first_max_idx & mAODscale == first_max_val, 1, 0)) %>%
  # 清理临时辅助列
  select(-first_max_val, -first_max_idx) %>%
  ungroup()

修正说明

  1. 锁定首次最大值的数值:新增first_max_val直接提取maxDate==1对应的mAODscale值,避免切片后重新计算最大值导致的偏差(原代码切片后取的max(mAODscale)可能不是首次最大值)
  2. 限定标记范围:用row_number() > first_max_idx确保只标记首次最大值出现之后的行,排除首次最大值本身
  3. 保留完整数据:不提前切片删除首个最大值前的记录,若不需要这些行,可在最后追加slice(first_max_idx:n())

内容的提问来源于stack exchange,提问作者Melanie Baker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:38:30