序列发生时反向计数向量元素

pip*_*oma 7 r vector vectorization sequence

我有值的向量NA,0以及1:

x <- c(NA, 0, 0, 1, 1, 1, 1, NA, 0, 0, 0, 0, NA, NA, 1, 1, 1, NA)
#> x
#[1] NA  0  0  1  1  1  1 NA  0  0  0  0 NA NA  1  1  1 NA
Run Code Online (Sandbox Code Playgroud)

每当序列从切换1到时NA,我想NAs在该事件之前计算非位置并用该数字替换元素.我期待这个输出:

#> x_output
#[1] NA  6  5  4  3  2  1 NA  0  0  0  0 NA NA  3  2  1 NA
Run Code Online (Sandbox Code Playgroud)

有人有解决方案吗?矢量化方法是优选的,因为矢量很长并且数据集相当大.

Rol*_*and 8

使用rle以限定运行长度和ave创建的序列:

x <- c(NA, 0, 0, 1, 1, 1, 1, NA, 0, 0, 0, 0, NA, NA, 1, 1, 1, NA)

fun <- function(x) {
  x <- rev(x)
  y <- rle(!is.na(x))
  y$values[y$values] <- seq_along(y$values[y$values])
  y <- inverse.rle(y)

  x[!is.na(x)] <- ave(x[!is.na(x)], y[!is.na(x)], FUN = function(x) {
    if (x[1] == 0L) return(x)
    seq_along(x)
  })
  rev(x)
}

fun(x)
#[1] NA  6  5  4  3  2  1 NA  0  0  0  0 NA NA  3  2  1 NA
Run Code Online (Sandbox Code Playgroud)