基于Code列表与30天日期间隔的R数据行筛选求助
R实现按ID分组筛选特定行对
步骤1:数据预处理
首先需要将Data_List拆分为字符向量,并把日期列转换为可计算的Date类型:
library(dplyr) library(lubridate) # 拆分目标Code列表 target_codes <- strsplit(Data_List, "\\|")[[1]] # 转换日期格式并处理数据 df_processed <- df %>% mutate( Date1 = dmy(Date1), Date2 = dmy(Date2) )
步骤2:分组筛选符合条件的行对
按ID分组后,通过辅助标记列识别需要保留的行:
result <- df_processed %>% group_by(ID) %>% mutate( # 标记当前行Code是否属于目标列表 is_target = Code %in% target_codes, # 计算下一行Date1与当前行Date2的天数间隔 date_diff = as.numeric(lead(Date1) - Date2), # 标记当前行是否满足条件(属于目标且下一行日期间隔≤30天) keep_current = is_target & (!is.na(date_diff) & date_diff <= 30), # 标记下一行是否需要保留(由上一行的条件触发) keep_next = lag(keep_current, default = FALSE) ) %>% # 保留满足条件的当前行或被触发的下一行 filter(keep_current | keep_next) %>% # 移除辅助列,恢复原数据结构 select(-is_target, -date_diff, -keep_current, -keep_next) %>% ungroup() # 转换日期回原格式(可选) result <- result %>% mutate( Date1 = format(Date1, "%d/%m/%Y"), Date2 = format(Date2, "%d/%m/%Y") ) print(result)
输出结果
运行上述代码后,得到的结果与预期完全一致:
# A tibble: 6 × 4 ID Code Date1 Date2 <chr> <chr> <chr> <chr> 1 A I611 01/01/2021 03/01/2021 2 A L111 04/01/2021 09/01/2021 3 C I613 09/08/2021 09/09/2021 4 C I639 10/09/2021 18/09/2021 5 D I639 03/01/2021 04/01/2021 6 D B111 11/01/2021 14/01/2021
逻辑说明
- 用
strsplit拆分Data_List为目标Code向量,实现匹配判断; - 日期转换为
Date类型是计算天数间隔的必要前提; - 分组后通过
lead()获取下一行的Date1,计算与当前行Date2的间隔; - 用
keep_current标记触发条件的行,keep_next标记被触发的下一行,最终筛选出两者的并集; - 可选将日期转回原字符串格式,保持输出与原数据格式一致。
内容的提问来源于stack exchange,提问作者JeffWithpetersen
相关产品推荐
相关产品推荐

