我有一个二进制变量来表示事件是否发生:
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或任何其他方式获得?
利用二进制向量这一事实,下面给出了您想要的输出:
cummax(seq_along(event) * event)
每当你需要用值填充重复时,请想想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)
你也可以这样做 -
> 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
另一个选择是找到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