R语言如何排除同一类别中与上一保留观测间隔不足80天的日期
实现思路与代码
你之前用相邻行差值计算的方法不符合需求,核心原因是差值计算的基准是上一条全部行的日期,而你需要的基准是上一条被保留的行的日期,必须逐行迭代动态更新判断基准才能实现需求。
以下是tidyverse生态的最简实现方案:
# 加载依赖包 library(tidyverse) library(lubridate) # 数据处理 df_result <- df %>% # 先将日期列转为标准日期格式,根据你的实际日期格式调整转换函数 mutate(Date = ymd(Date)) %>% # 同类别同日期重复记录可先去重,无重复可删除此行 distinct(category, Date, .keep_all = TRUE) %>% # 按类别、日期升序排列 arrange(category, Date) %>% group_by(category) %>% mutate( # 动态累积记录上一个被保留的观测日期 last_keep_date = accumulate(Date, function(prev_keep, curr) { if (curr - prev_keep >= days(80)) curr else prev_keep }), # 匹配到基准更新的行即为符合保留规则的记录 keep = Date == last_keep_date ) %>% # 筛选保留行并删除辅助列 filter(keep) %>% select(-last_keep_date, -keep)
效果验证
拿你提供的示例数据测试,处理后会保留编号为1、3、4、6、7、9的观测,完全符合你要求的规则。针对补充1的场景,2015-10-03与上一个保留的2015-06-29间隔96天,会被正常判定为保留行,不会被误删。
内容的提问来源于stack exchange,提问作者Aleksi Markkanen
相关产品推荐
相关产品推荐

