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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:18:16