如何获得最后一个非零元素的位置

问题描述 投票:18回答:4

我有一个二进制变量来表示事件是否发生:

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或任何其他方式获得?

r tidyverse base
4个回答
18
投票

利用二进制向量这一事实,下面给出了您想要的输出:

cummax(seq_along(event) * event)

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)

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

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
© www.soinside.com 2019 - 2024. All rights reserved.