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

标签 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

每当序列从 1 切换时至 NA ,我要统计非NAs的位置在该事件之前并用该数字替换元素。我希望这个输出:
#> x_output
#[1] NA  6  5  4  3  2  1 NA  0  0  0  0 NA NA  3  2  1 NA

有人对此有解决方案吗?首选矢量化方法,因为矢量很长且数据集相当大。

最佳答案

使用 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

关于当序列发生时反向计数向量元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47218554/

相关文章:

c++ - 如何使用这个宏来测试内存是否对齐?

r - 在 R 中平滑方向(角度)数据

来自 data.frame 每一列的随机样本

python - 使用另一个数组中的值构建 NumPy 数组

vector - 试图在Rc <RefCell <... >>内部修改 future Vec

c++ - 用零填充 vector

r - 具有任意长度查询的查找表,无需在 R 中使用 for 循环

r - 你如何在 Rmarkdown 中制作一个漂亮的表格

r - 查找数据中的连续天数

c++ - 如何到达vector<list<int>>的指定元素?