R语言按患者ID分组计算随访时间并提取首次就诊记录
R语言患者随访数据处理实现方案
初始数据集构造
先运行以下代码生成原始patient数据集:
patient <- data.frame( patient_ID = c(1,1,2,2,2,3,3,4,4,4), age = c(63,64,60,61,63,61,62,77,77,79), visit_number = c(1,2,1,2,3,1,2,1,2,3), followup_days = c(0,504,0,390,798,0,379,0,310,621), diagnosis = c(0,0,0,1,1,0,0,0,0,1) )
生成带time字段的patient1数据集
实现逻辑
按patient_ID对患者分组,对每个患者单独计算统一的time值:
- 若患者存在确诊记录(
diagnosis=1),取首次确诊对应随访间隔天数作为该患者所有记录的time值 - 若患者全程无确诊记录,取末次就诊对应的随访间隔天数(即该患者最大的
followup_days值)作为该患者所有记录的time值
代码实现(dplyr版本,代码简洁易读)
# 若未安装dplyr,先运行 install.packages("dplyr") library(dplyr) patient1 <- patient %>% group_by(patient_ID) %>% mutate( time = case_when( any(diagnosis == 1) ~ followup_days[which(diagnosis == 1)[1]], TRUE ~ max(followup_days) ) ) %>% ungroup()
运行后得到的patient1和给出的示例结果完全一致。
生成仅含首次就诊记录的new_patient数据集
实现逻辑
在patient1的基础上,筛选visit_number=1(首次就诊)的记录即可。
注:给出的目标示例中diagnosis字段存在拼写笔误写为disgonosis,可按需重命名字段匹配示例。
代码实现
new_patient <- patient1 %>% filter(visit_number == 1) # 若需要完全匹配示例的错误字段名,取消运行下一行注释 # new_patient <- new_patient %>% rename(disgonosis = diagnosis)
无第三方包依赖的基础R实现版本
如果不想安装dplyr包,可以直接用基础R语法完成全流程:
# 步骤1:计算每个患者对应的time值 time_map <- tapply(1:nrow(patient), patient$patient_ID, function(rows){ sub_data <- patient[rows, ] if(any(sub_data$diagnosis == 1)){ first_diag_row <- rows[sub_data$diagnosis == 1][1] return(patient$followup_days[first_diag_row]) }else{ return(max(sub_data$followup_days)) } }) patient$time <- as.numeric(time_map[as.character(patient$patient_ID)]) patient1 <- patient # 步骤2:筛选首次就诊记录 new_patient <- patient1[patient1$visit_number == 1, ]
内容的提问来源于stack exchange,提问作者Ellie
相关产品推荐
相关产品推荐

