You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件的带滞后修正的累积时间和计算(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:42:49