[英]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
,即:
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
在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
或者使用data.table
rowid
library(data.table)
(NA^!cummax(trt)) *rowid(cumsum(trt))-1
#[1] NA NA 0 1 2 3 0 1 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.