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)
有人有解决方案吗?矢量化方法是优选的,因为矢量很长并且数据集相当大.
使用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)