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

在R中为可开关的治疗序列创建相对时间索引

解决方案:为多次启停的治疗创建相对时间索引

针对你提出的个体治疗可多次开启关闭的场景,我们可以结合dplyr和rle函数实现需求,具体步骤如下:

首先加载所需工具包:

library(dplyr)

然后处理目标数据:

df <- data.frame(
  id = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2),
  treatment = c(0,0,1,1,0,0,0,1,1,1,0,0,1,1,1)
)

df_result <- df %>%
  group_by(id) %>%
  # 生成每个个体内的连续状态段标记
  mutate(
    segment_id = rep(seq_along(rle(treatment)$values), rle(treatment)$lengths),
    is_treatment = treatment == 1,
    segment_length = rep(rle(treatment)$lengths, rle(treatment)$lengths)
  ) %>%
  group_by(id, segment_id) %>%
  mutate(
    # 治疗段从0开始递增
    relative_time = ifelse(is_treatment, 
                           seq(0, segment_length - 1),
                           # 非治疗段:若后续有治疗则倒序计数,否则设为NA
                           ifelse(lead(is_treatment, n = 1, default = FALSE),
                                  seq(-segment_length, -1),
                                  NA_integer_)
                           )
  ) %>%
  ungroup() %>%
  # 移除中间辅助列
  select(-segment_id, -is_treatment, -segment_length)

print(df_result)

运行代码后得到的结果与你期望的一致:

# A tibble: 15 × 3
      id treatment relative_time
   <dbl>     <dbl>         <int>
 1     1         0            -2
 2     1         0            -1
 3     1         1             0
 4     1         1             1
 5     1         0            -3
 6     1         0            -2
 7     1         0            -1
 8     1         1             0
 9     1         1             1
10     1         1             2
11     1         0            NA
12     2         0            -1
13     2         1             0
14     2         1             1
15     2         1             2

代码逻辑说明:

  • rle函数:识别每个个体内连续的treatment状态(连续0或连续1),生成段分组和段长度。
  • 非治疗段判断:用lead函数判断当前非治疗段后是否有治疗段,若是则生成倒序负数索引;若为末尾无后续治疗的非治疗段,设为NA(对应示例中的.,R中常用NA表示缺失值)。
  • 治疗段处理:直接从0开始生成递增索引。

内容的提问来源于stack exchange,提问作者DarkenExcalibur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:46:06