簡體   English   中英

滿足條件時,滯后向量加 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 ,即:

  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 循環的情況下可行,那將是理想的,但不是絕對必要的。

也許你可以試試下面的代碼

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

我們也可以使用

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM