问题描述
trt <- c(0,1,0)
我要创建一个向量days_since
,
- 直到第一次治疗一直都是NA。
- 是0,其中
trt
是1 - 计算自上次治疗以来的天数
因此,输出days_since
应该是:
days_since <- c(NA,NA,2,3,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
上的trt
应用于治疗分组
> v <- cumsum(trt)
> v
[1] 0 0 1 1 1 1 2 2 2
- 第二,使用
ave
有助于在每个组中添加顺序索引
> ave(trt,FUN = seq_along)-1
[1] 0 1 0 1 2 3 0 1 2
- 最后,由于该值在第一次处理之前为
NA
,所以这意味着v == 1
出现之前的所有值都应替换为NA
。因此,我们使用replace
,索引逻辑遵循v < 1
> replace(ave(trt,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