在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
相关产品推荐
相关产品推荐

