如何用dplyr按时间间隔拆分数据行并更新协变量
使用dplyr按12个月间隔拆分随访数据
原始数据
患者随访数据框p如下,每行对应一名患者的随访记录:
p <- structure(list(id = 1:3, treatment = structure(c(1L, 1L, 1L), levels = c("SSTR", "SSA", "Control"), class = "factor"), age = c(31.3, 36.9, 44.6 ), sex = structure(c(1L, 1L, 2L), levels = c("0", "1"), class = "factor"), progression = c(0L, 1L, 1L), pfs = c(15.6, 8.9, 25.5)), row.names = c(NA, 3L), class = "data.frame")
打印后的数据结构:
id treatment age sex progression pfs 1 1 SSTR 31.3 0 0 15.6 2 2 SSTR 36.9 0 1 8.9 3 3 SSTR 44.6 1 1 25.5
需求说明
需按每12个月的随访间隔拆分每行数据:
- 不变协变量:
id、treatment、sex(及其他同类变量) - 需更新的变量:
age:每个时间间隔增加1岁(每12个月增长1岁)- 将
pfs拆分为start和stop,标识每个12个月间隔的起止时间 - 新增
interval字段,标识间隔序号(0-12月为1,12-24月为2,以此类推)
- 仅在患者最后一个随访间隔保留原
progression值,其余间隔该字段设为0
解决方案(dplyr实现)
library(dplyr) library(tidyr) p_processed <- p %>% # 计算每个患者需要拆分的间隔总数 mutate(n_intervals = ceiling(pfs / 12)) %>% # 按id拆分成多行长格式,生成间隔序号 uncount(n_intervals, .id = "interval") %>% # 计算每个间隔的起止时间、更新年龄和进展状态 mutate( start = (interval - 1) * 12, stop = pmin(interval * 12, pfs), age = age + (interval - 1), progression = ifelse(stop == pfs, progression, 0) ) %>% # 调整列顺序匹配预期输出 select(id, treatment, sex, age, progression, start, stop, interval) print(p_processed)
输出结果
id treatment sex age progression start stop interval 1 1 SSTR 0 31.3 0 0 12.0 1 2 1 SSTR 0 32.3 0 12 15.6 2 3 2 SSTR 0 36.9 1 0 8.9 1 4 3 SSTR 1 44.6 0 0 12.0 1 5 3 SSTR 1 45.6 0 12 24.0 2 6 3 SSTR 1 46.6 1 24 25.5 3
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

