在R语言中计算患者治疗结束时间的技术实现问询
解决方案:计算患者治疗的开始与结束时间
核心修正逻辑:结束时间需要连续检查记录,一旦出现不符合条件的条目,后续记录不再纳入判断,而非全局查找所有符合条件的最大V2。以下是基于dplyr的实现代码:
library(dplyr) # 处理数据逻辑 df_processed <- df %>% group_by(Patient) %>% # 提取患者首次就诊的初始治疗方案 mutate(initial_T = first(T1[V1 == 1])) %>% # 计算开始时间:首次就诊满足T1=T2且R2为Response时,start为对应V2 mutate(start = ifelse(V1 == 1 & T1 == T2 & R2 == "Response", V2, NA)) %>% # 将start值填充至该患者所有行,方便后续判断 fill(start, .direction = "downup") %>% # 标记当前记录是否符合结束时间的判断条件 mutate(valid = !is.na(start) & R2 %in% c("Response", "Death") & T1 == initial_T) %>% # 生成连续有效记录的分组:一旦出现无效记录,后续组号递增 mutate(valid_group = cumsum(!valid)) %>% # 仅保留从开头连续有效的记录组(valid_group=0) filter(valid_group == 0) %>% # 取该组最后一个V2作为结束时间 mutate(end = last(V2)) %>% # 合并回原始数据,保留所有行 right_join(df, by = names(df)) %>% group_by(Patient) %>% # 填充所有行的start和end值 fill(start, end, .direction = "downup") %>% ungroup() %>% # 移除中间辅助列 select(-initial_T, -valid, -valid_group)
逻辑说明
- 分组处理:按
Patient分组,确保每个患者的治疗时间计算独立进行。 - 初始方案提取:获取每个患者首次就诊(
V1=1)时的治疗方案initial_T,作为后续判断的基准。 - 开始时间计算:与原有逻辑一致,仅在首次就诊满足
T1=T2且R2="Response"时标记开始时间,并用fill填充至该患者所有行。 - 有效记录标记:标记符合结束时间判断条件的记录(有开始时间、
R2为Response/Death、T1与初始方案一致)。 - 连续有效分组:通过
cumsum(!valid)生成分组,确保仅保留从开头连续有效的记录,中途出现无效记录则终止判断。 - 结束时间确定:取连续有效记录的最后一个
V2作为该患者的结束时间,再填充至所有行。
验证结果
- 第一个示例中:
- Dave: start=150,end=568
- Angel: start=NA,end=NA
- Joe: start=150,end=150
- Cara: start=150,end=375
- 补充示例中的Tanya:start=150,end=375(符合预期,而非错误的600)
内容的提问来源于stack exchange,提问作者rstudio_noob
相关产品推荐
相关产品推荐

