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

R 如何获取最后一个非零元素的位置,r,tidyverse,base,R,Tidyverse,Base,我有一个二进制变量,表示事件是否发生: event <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) event每当你需要用一个值来填充重复时,请思考 在这种情况下,您可以确定运行长度,然后根据次数重复count==0的索引: lengths = rle(event == 0)$lengths nonzeros = which(event != 0) runs = c(0, rep(nonzeros, each = 2)) resu

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

event <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0)

event每当你需要用一个值来填充重复时,请思考

在这种情况下,您可以确定运行长度,然后根据次数重复
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)

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

cummax(seq_along(event) * event)

你也可以这样做-

> 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

>zero.locf另一个选项是查找
事件==1的索引,并根据
长度重复该索引

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

对比我的解决方案优雅多了。我考虑的是累积和,但我没有想到将索引乘以二进制向量。或者不乘以
cummax(ifelse(event,seq_-along(event),0))
@jogo如果
事件的类型是
逻辑的,那么这个解决方案是有意义的。由于R的隐式转换,它甚至对数值向量也有效,但是…呃。
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