首页 > 解决方案 > 满足条件时,滞后向量加 1,同时重置为 0

问题描述

我有一系列的治疗,每天一次(二进制),说:

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 循环的情况下可行,那将是理想的,但不是绝对必要的。

标签: rlagcumsum

解决方案


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

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

这使

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

解释

  • 首先,我们申请cumsumtrt治疗进行分组
> 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

推荐阅读