如何在多站点时间序列数据中定位最大值再次出现的日期
修正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()
修正说明
- 锁定首次最大值的数值:新增
first_max_val直接提取maxDate==1对应的mAODscale值,避免切片后重新计算最大值导致的偏差(原代码切片后取的max(mAODscale)可能不是首次最大值) - 限定标记范围:用
row_number() > first_max_idx确保只标记首次最大值出现之后的行,排除首次最大值本身 - 保留完整数据:不提前切片删除首个最大值前的记录,若不需要这些行,可在最后追加
slice(first_max_idx:n())
内容的提问来源于stack exchange,提问作者Melanie Baker
相关产品推荐
相关产品推荐

