R语言筛选数据框中癌症日期距入组日期≤10年的行
R语言按日期条件筛选数据框行实现方案
前置说明
你提供的初始日期转换代码存在冗余:重复对inclusion date2列执行了两次as.Date()转换,不影响运行结果但可删除重复行。
本次筛选的核心逻辑:
- 每个个体仅对应1个非空入组日期,需先提取每行的有效入组时间
- 保留同时满足两个条件的记录:
- 癌症确诊日期早于对应入组日期
- 癌症确诊日期最多早于入组日期10年,即确诊日期不早于「入组日期往前推10年」的时间点
方法1:基础R实现(无需安装额外包)
用基础R函数逐行提取有效入组日期,按天折算时间间隔(按每年365.25天计算,降低闰年带来的误差):
# 定义所有入组日期列名 inclusion_cols <- c("inclusion date0", "inclusion date2", "inclusion dat4", "inclusion date6") # 逐行提取非NA的有效入组日期 d$inclusion_valid <- as.Date( apply(d[, inclusion_cols], 1, function(x) x[!is.na(x)]), origin = "1970-01-01" ) # 计算入组日期与癌症日期的差值(正数代表确诊日期更早) d$date_gap <- d$inclusion_valid - d$`cancer date` # 筛选符合条件的行 d_filtered <- d[which( d$date_gap > 0 # 确诊日期早于入组日期 & d$date_gap <= 365.25*10 # 间隔不超过10年 ), ] # 可选:删除中间生成的辅助列 d_filtered <- subset(d_filtered, select = -c(inclusion_valid, date_gap))
方法2:tidyverse方案(代码更简洁,时间计算更精准)
使用dplyr做数据操作、lubridate处理日期逻辑,可自动处理闰年、月份天数不一致的问题,避免固定天数折算的误差:
library(dplyr) library(lubridate) d_filtered <- d %>% rowwise() %>% mutate( # 提取当前行的有效入组日期 inclusion_valid = c_across(starts_with("inclusion")) %>% na.omit() %>% as.Date(origin = "1970-01-01"), # 计算入组日期往前推10年的阈值 date_cutoff = inclusion_valid %m-% years(10) ) %>% ungroup() %>% # 按条件筛选 filter( `cancer date` < inclusion_valid, `cancer date` >= date_cutoff ) %>% # 可选:移除辅助列 select(-inclusion_valid, -date_cutoff)
示例数据筛选结果
针对你提供的5条示例数据,最终符合条件的是个体1、3、4:
- 个体1:入组2014-11-01,确诊2004-11-01,间隔刚好10年,符合要求
- 个体3:入组2016-01-18,确诊2011-01-15,间隔约5年,符合要求
- 个体4:入组2020-07-11,确诊2016-03-16,间隔约4年,符合要求
- 个体2:日期间隔超过15年,不符合
- 个体5:日期间隔超过10年11个月,不符合
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

