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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:24:23