滞后向量在满足条件时加 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
,即:
- 第一次治疗前是否为 NA。
- 为 0 其中
trt
为 1
- 计算自上次治疗以来的天数
所以,输出 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
我有一系列的治疗方法,每天一次(二元),比如说:
trt <- c(0, 0, 1, 0, 0, 0, 1, 0, 0)
我想创建一个矢量,days_since
,即:
- 第一次治疗前是否为 NA。
- 为 0 其中
trt
为 1 - 计算自上次治疗以来的天数
所以,输出 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
overtrt
对治疗进行分组
> 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