R语言数据筛选:按标识符列表+日期间隔条件保留记录
解决方案
要实现你的筛选需求,我们可以借助dplyr包完成分组逻辑处理,具体步骤如下:
步骤1:预处理数据
先把字符型日期转为可计算的日期格式,并将Values_List拆分为匹配用的字符向量:
# 加载依赖包 library(dplyr) library(stringr) # 原数据 Values_List <- "I611|I613|I614|I639" df <- read.table(textConnection("ID Identifier Date1 Date2 A I611 01/01/2021 03/01/2021 A I611 04/01/2021 08/01/2021 A Z422 09/01/2021 30/01/2021 A I639 08/11/2021 09/11/2021 A B233 10/11/2021 11/11/2021 B Z317 09/01/2021 30/01/2021 B I611 04/02/2021 08/02/2021 C I614 04/02/2021 11/02/2022 D I611 01/01/2022 02/01/2022 D I611 08/01/2022 07/01/2022 "), header=TRUE) # 转换日期格式 df <- df %>% mutate( Date1 = as.Date(Date1, format = "%d/%m/%Y"), Date2 = as.Date(Date2, format = "%d/%m/%Y") ) # 拆分目标Identifier列表 target_ids <- str_split_1(Values_List, "\\|")
步骤2:分组筛选记录
按ID分组后,标记并筛选需要保留的记录:
- 当前记录的
Identifier在目标列表中,且与下一条记录的日期间隔≤30天(保留当前记录) - 前一条记录满足上述条件(保留这条记录)
result <- df %>% arrange(ID, Date1) %>% # 确保每组内按时间排序,避免逻辑错误 group_by(ID) %>% mutate( # 计算当前记录Date2与下一条记录Date1的天数差 days_diff = lead(Date1) - Date2, # 标记当前记录是否符合保留条件 keep_current = Identifier %in% target_ids & days_diff <= 30, # 标记下一条记录是否需要保留(即前一条符合条件) keep_next = lag(keep_current, default = FALSE) ) %>% ungroup() %>% # 保留满足任一条件的记录 filter(keep_current | keep_next) %>% # 移除临时计算列 select(-days_diff, -keep_current, -keep_next)
验证输出
运行代码后,result的输出与你期望的结果一致:
print(result) #> # A tibble: 5 × 4 #> ID Identifier Date1 Date2 #> <chr> <chr> <date> <date> #> 1 A I611 2021-01-01 2021-01-03 #> 2 A I611 2021-01-04 2021-01-08 #> 3 A Z422 2021-01-09 2021-01-30 #> 4 D I611 2022-01-01 2022-01-02 #> 5 D I611 2022-01-08 2022-01-07
(注:原数据中D的第二条记录Date2为07/01/2022,若为笔误可自行修正,代码逻辑不受影响)
内容的提问来源于stack exchange,提问作者JeffWithpetersen
相关产品推荐
相关产品推荐

