我有一个二进制变量,表示事件是否发生:
event <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0)
我需要获取一个变量,该变量指示上一次事件发生的时间。预期的输出将是:
last_event <- c(0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13)
如何用底数R,tidyverse或任何其他方式获得它?
答案 0 :(得分:18)
利用具有二进制向量的事实,以下内容将提供所需的输出:
cummax(seq_along(event) * event)
答案 1 :(得分:8)
每当需要用值填充重复项时,请考虑run-length encoding。
在这种情况下,您可以确定游程长度,然后根据次数重复count == 0
的索引:
lengths = rle(event == 0)$lengths
nonzeros = which(event != 0)
runs = c(0, rep(nonzeros, each = 2))
result = rep(runs, lengths)
或者,在RLE中替换运行,然后将其求逆:
rle = rle(event == 0)
nonzeros = which(event != 0)
rle$values = c(0, rep(nonzeros, each = 2))
result = inverse.rle(rle)
答案 2 :(得分:1)
您也可以这样做-
> zero.locf <- function(x) {
v <- x!=0
c(0, x[v])[cumsum(v)+1]
}
> zero.locf(1:length(event)*event)
[1] 0 0 0 0 5 5 5 5 5 5 5 5 13 13 13 13
答案 3 :(得分:1)
另一种选择是在event == 1
处找到索引,并根据length
重复该索引。
rep(c(0, which(event == 1)), tapply(event, cumsum(event == 1), length))
#[1] 0 0 0 0 5 5 5 5 5 5 5 5 13 13 13 13