基于特定条件合并R语言患者随访数据的技术问询
患者随访数据合并处理方案
原始数据集
df <- data.frame( Patient = c('Dave', 'Dave', 'Dave','Dave','Dave','Dave','Dave', "Angel", "Angel", "Angel", "Cara", "Cara"), V1 = c(1, 150, 240,430,530,650,800, 1, 150, 375, 1, 150), V2 = c(150, 240,430,530,650,800,900, 150, 375, 568, 150,375), R1 = c("Disease","Disease","Disease","Response","Response","Disease","Response", "Disease","Response", "Response", "Disease", "Response"), R2 = c("Disease", "Disease", "Response","Response","Disease","Response","Response", "Response", "Response", "Response", "Response", "Death") )
需求说明
按患者分组,合并状态连续相同的行直至状态发生变化,最终数据集保留R1≠R2的行(最后一条记录除外)。逻辑伪代码如下:
if (r1 = r2 & not last record) { record v1 and r1 walkthrough data until r1=r2 or last record record v2 and r2 print }
预期输出
| Patient | V1 | V2 | R1 | R2 |
|---|---|---|---|---|
| Dave | 1 | 430 | Disease | Response |
| Dave | 430 | 650 | Response | Disease |
| Dave | 650 | 800 | Disease | Response |
| Dave | 800 | 900 | Response | Response |
| Angel | 1 | 568 | Disease | Response |
| Cara | 1 | 375 | Disease | Death |
解决方案(基于dplyr)
library(dplyr) df_processed <- df %>% group_by(Patient) %>% # 生成状态分组:当相邻行的状态衔接中断时,创建新分组 mutate(status_group = cumsum(c(TRUE, R2[-n()] != R1[-1]))) %>% group_by(Patient, status_group) %>% # 聚合每组的起始/结束时间、起始/结束状态 summarise( V1 = first(V1), V2 = last(V2), R1 = first(R1), R2 = last(R2), .groups = "drop" ) %>% group_by(Patient) %>% # 标记每组最后一条记录,筛选符合条件的行 mutate(is_last = row_number() == n()) %>% filter(R1 != R2 | is_last) %>% select(-status_group, -is_last) # 查看结果 print(df_processed)
代码逻辑说明
- 状态分组:按患者分组后,通过
cumsum识别状态变化节点——每当前一行的结束状态(R2)和当前行的起始状态(R1)不一致时,就生成新的分组编号,将连续相同状态的行归为一组。 - 聚合数据:对每个状态分组,提取组内最早的随访起始时间(V1)、最晚的随访结束时间(V2)、起始状态(R1)和结束状态(R2)。
- 筛选结果:再次按患者分组,标记每组的最后一条记录,保留
R1≠R2的行或每组的最后一条记录,满足需求。
内容的提问来源于stack exchange,提问作者rstudio_noob
相关产品推荐
相关产品推荐

