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

在R中基于含重复ID的另一数据框日期范围筛选数据框

解决方案:基于日期差筛选含重复ID的观测

问题需求

从数据框df1中筛选记录,要求每条记录的Collected日期与df2中对应Accession的Collected日期相差±7天以内,同时保留所有符合条件的重复MRN观测。


输入数据

数据框df1

Name <- c("Doe, John","Doe, John","Doe, John", "Doe, Jane", "Doe, Jane","Doe, Jane","Parker, Peter","Parker, Peter","Parker, Peter", "Stark, Tony","Stark, Tony","Stark, Tony")
Accession <- c(123, 234, 345, 456, 567, 678, 789, 8910, 1023, 1134, 1567, 1769)
MRN <-c(55555, 55555, 55555, 66666, 66666, 66666, 77777, 77777, 77777, 88888, 88888, 88888)
Collected <-c("2022-02-05", "2022-02-06", "2022-01-07", "2022-01-08", "2022-01-09", "2022-01-10", "2022-01-11", "2022-02-12", "2022-01-13", "2022-01-04", "2022-01-15", "2022-01-16")
Result <-c("Detected", "Detected", "Detected", "Detected", "Detected","Detected", "Detected", "Detected", "Detected", "Detected", "Detected", "Detected")

df1 <- data.frame(Name, Accession, MRN, Collected, Result)

数据框df2

Name <- c("Doe, John","Doe, John","Doe, John", "Doe, Jane", "Doe, Jane","Doe, Jane","Parker, Peter","Parker, Peter","Parker, Peter", "Stark, Tony","Stark, Tony","Stark, Tony")
Accession <- c(123, 234, 345, 456, 567, 678, 789, 8910, 1023, 1134, 1567, 1769)
MRN <-c(55555, 55555, 55555, 66666, 66666, 66666, 77777, 77777, 77777, 88888, 88888, 88888)
Collected <-c("2022-01-22", "2022-01-20", "2022-01-07", "2022-01-28", "2022-01-12", "2022-01-15", "2022-01-17", "2022-01-31", "2022-01-16", "2022-01-20", "2022-01-25", "2022-01-26")
Result <-c("Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive","Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive", "Presumptive")

df2 <- data.frame(Name, Accession, MRN, Collected, Result)

实现代码

使用dplyr包完成数据转换、合并与筛选:

library(dplyr)

# 转换日期列为日期格式
df1 <- df1 %>% mutate(Collected = as.Date(Collected))
df2 <- df2 %>% mutate(Collected = as.Date(Collected))

# 合并数据并筛选符合日期条件的记录
filtered_df <- df1 %>%
  # 按Accession匹配df2的日期
  inner_join(df2 %>% select(Accession, Collected_df2 = Collected), by = "Accession") %>%
  # 计算日期差的绝对值
  mutate(date_diff = abs(Collected - Collected_df2)) %>%
  # 筛选相差7天以内的记录
  filter(date_diff <= 7) %>%
  # 移除中间辅助列
  select(-Collected_df2, -date_diff)

# 输出结果
print(filtered_df)

输出结果

Name Accession   MRN  Collected  Result
1      Doe, John       345 55555 2022-01-07 Detected
2      Doe, Jane       456 66666 2022-01-08 Detected
3      Doe, Jane       567 66666 2022-01-09 Detected
4      Doe, Jane       678 66666 2022-01-10 Detected
5 Parker, Peter       789 77777 2022-01-11 Detected
6 Parker, Peter      1023 77777 2022-01-13 Detected
7    Stark, Tony      1567 88888 2022-01-15 Detected
8    Stark, Tony      1769 88888 2022-01-16 Detected

内容的提问来源于stack exchange,提问作者T.McMillen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:55:27