基于条件的带滞后修正的累积时间和计算(R语言)
解决方案
1. 计算满足tdc=1的时间间隔累积和
基于你的原始数据,我们可以用dplyr包快速实现需求:
原始数据
have <- data.frame(ID = c(1, 1, 1, 2, 3), tstart = c(0, 100, 200, 0, 0), tstop = c(100, 200, 500, 400, 300), tdc = c(0,1,1,0,1))
实现代码
library(dplyr) want <- have %>% # 计算每行的时间间隔 mutate(time_diff = tstop - tstart) %>% # 仅保留tdc=1的时间间隔,其余设为0 mutate(tdc_time = ifelse(tdc == 1, time_diff, 0)) %>% # 按ID分组计算累积和 group_by(ID) %>% mutate(tdc.cum = cumsum(tdc_time)) %>% # 移除中间辅助列 ungroup() %>% select(-time_diff, -tdc_time) # 查看结果 want
输出结果
ID tstart tstop tdc tdc.cum 1 1 0 100 0 0 2 1 100 200 1 100 3 1 200 500 1 400 4 2 0 400 0 0 5 3 0 300 1 300
2. 对累积时间进行10单位滞后修正
需求是每个ID中tdc=1的总累积和减去10,仅对该ID最后一个tdc=1的行生效:
实现代码
want2 <- want %>% group_by(ID) %>% # 标记每个ID最后一行tdc=1的记录 mutate(is_last_tdc1 = row_number() == max(which(tdc == 1)) & tdc == 1, # 对标记行的累积和减10,其余保持不变 tdc.cum = ifelse(is_last_tdc1, tdc.cum - 10, tdc.cum)) %>% ungroup() %>% select(-is_last_tdc1) # 查看结果 want2
输出结果
ID tstart tstop tdc tdc.cum 1 1 0 100 0 0 2 1 100 200 1 100 3 1 200 500 1 390 4 2 0 400 0 0 5 3 0 300 1 290
补充说明
你之前用survival::tmerge()和cumtdc()得到的是tdc的计数累积,而非时间间隔的累积——这两个函数默认是对暴露状态的次数进行累积,而非时长累积。上面的方法直接基于时间间隔计算,更贴合你的需求。
内容的提问来源于stack exchange,提问作者TJ87
相关产品推荐
相关产品推荐

