滞后向量在满足条件时加 1,同时重置为 0

Lagging vector adding 1 while resetting to 0 when a condition is met

我有一系列的治疗方法,每天一次(二元),比如说:

trt <- c(0, 0, 1, 0, 0, 0, 1, 0, 0)

我想创建一个矢量,days_since,即:

  1. 第一次治疗前是否为 NA。
  2. 为 0 其中 trt 为 1
  3. 计算自上次治疗以来的天数

所以,输出 days_since 应该是:

days_since <- c(NA, NA, 0, 1, 2, 3, 0, 1, 2)

我如何在 R 中执行此操作?要获得 days_since,我基本上需要滞后一个元素并加 1,但每次原始向量 (trt) 为 1 时都会重置。如果没有 for 循环也是可行的,那将是理想,但并非绝对必要。

也许你可以试试下面的代码

v <- cumsum(trt)
replace(ave(trt,v,FUN = seq_along)-1,v<1,NA)

这给出了

[1] NA NA  0  1  2  3  0  1  2

说明

  • 首先,我们应用 cumsum over trt 对治疗进行分组
> v <- cumsum(trt)
> v
[1] 0 0 1 1 1 1 2 2 2
  • 其次,使用ave有助于在每个组内添加顺序索引
> ave(trt,v,FUN = seq_along)-1
[1] 0 1 0 1 2 3 0 1 2
  • 最后,由于第一个处理之前的值为NA,也就是说v == 1出现之前的所有值都应该被NA代替。因此我们使用replace,索引逻辑遵循v < 1
> replace(ave(trt,v,FUN = seq_along)-1,v<1,NA)
[1] NA NA  0  1  2  3  0  1  2

我们也可以使用

(NA^!cummax(trt)) * sequence(table(cumsum(trt)))-1
#[1] NA NA  0  1  2  3  0  1  2

rowid 来自 data.table

library(data.table)
(NA^!cummax(trt)) *rowid(cumsum(trt))-1
#[1] NA NA  0  1  2  3  0  1  2