【问题标题】:Lagging vector adding 1 while resetting to 0 when a condition is met满足条件时,滞后向量加 1,同时重置为 0
【发布时间】:2020-09-25 20:51:19
【问题描述】:

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

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

【问题讨论】:

    标签: r lag cumsum


    【解决方案1】:

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

    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 应用于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 &lt; 1
    > replace(ave(trt,v,FUN = seq_along)-1,v<1,NA)
    [1] NA NA  0  1  2  3  0  1  2
    

    【讨论】:

    • 感谢您的回复。你能解释一下这里第二行发生了什么吗?具体来说,ave(trt,v,FUN = seq_along)?
    【解决方案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
    

    【讨论】:

    • 绝妙的解决方案!向你学习sequence :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2022-10-06
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多