我有一个带有值的向量 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/