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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:03:28