在R中计算自最近随访或基线起的天数(含多重复实例数据集)
解决方案
首先注意原始数据里的visit_date包含字符串"NA",需要先转换为日期类型并处理缺失值,否则无法进行日期计算。以下是完整的处理流程:
1. 数据预处理
先将visit_date转换为Date类型,把字符串"NA"替换为真实的缺失值:
library(dplyr) # 原始数据 data <- data.frame( record_id = c(1,1,1,2,3,4,4,5,6,7,8,8,9,10,10,10), visit_date = c("2020-09-24", "2020-12-05", "2021-03-01", "2021-10-03", "2021-10-01", "2021-10-05", "NA", "2021-08-25", "2021-09-19", "2021-10-01", "2021-09-27", "2021-09-07", "2021-10-03", "2021-10-08", "2022-03-22", "2022-07-12"), repeat_instance = c(0,1,2,0,0,0,1,0,0,0,0,1,0,0,1,2), Time_Since_Appointment = c("NA", "72d 1H 0M 0S", "86d 0H 0M 0S", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1076d 0H 0M 0S", "NA", "NA", "165d 0H 0M 0S", "112d 0H 0M 0S") ) # 预处理:转换日期类型,处理字符串NA data_clean <- data %>% mutate(visit_date = as.Date(visit_date, na.strings = "NA"))
2. 生成目标时间差变量
按record_id分组,判断每个组是否存在repeat_instance>0的记录,选择对应的日期计算与今日的时间差:
result <- data_clean %>% group_by(record_id) %>% mutate( # 标记当前组是否有重复实例 has_repeat = any(repeat_instance > 0, na.rm = TRUE), # 选择用于计算的日期:有重复则取最新的visit_date,否则取基线日期(repeat_instance=0) target_date = ifelse(has_repeat, max(visit_date, na.rm = TRUE), visit_date[repeat_instance == 0]), # 转换为Date类型(ifelse会返回数值,需转回日期格式) target_date = as.Date(target_date, origin = "1970-01-01"), # 计算距今日的天数 days_since_today = as.numeric(Sys.Date() - target_date), # 计算距今日的周数(保留两位小数) weeks_since_today = round(days_since_today / 7, 2) ) %>% ungroup()
关键说明
has_repeat:用any(repeat_instance > 0)判断当前患者是否有随访记录target_date:- 有随访记录时,取该患者所有非缺失的
visit_date中的最大值(最新随访日期) - 无随访记录时,取该患者
repeat_instance=0对应的基线日期
- 有随访记录时,取该患者所有非缺失的
- 时间差计算:
Sys.Date()获取当前系统日期,用as.numeric()将日期差转换为数值型天数,再除以7得到周数
可通过以下代码查看处理后的关键列:
select(result, record_id, visit_date, repeat_instance, target_date, days_since_today, weeks_since_today)
内容的提问来源于stack exchange,提问作者Ariana Johnson
相关产品推荐
相关产品推荐

