通过向量循环向后

时间:2015-01-09 05:58:13

标签: r

我想在向量中的值之前直接计算NA的数量。我目前正在尝试使用嵌套的“while”循环,因为这有助于计算之后的NA数量。这是我的代码,带有一个样本向量,我一直得到1的NA值:

x <- c(1:10)
x[3:6] <- NA
    for (i in 1:length(x)){
        if (is.na(x[i])){
            j <- i
                while (is.na(x[j])){
                j <- j - 1
                }
            x[i] <- j - i
         }
         else{
         x[i] <- x[i]
    }
}

返回

[1,2,-1,-1,-1,-1,7,8,9,10]

我想要的价值是

[1,2,0,1,2,3,7,8,9,10]

编辑 - 我添加了最后一个大括号并修正了输出值

2 个答案:

答案 0 :(得分:1)

怎么样:

replace(x, is.na(x), (cumsum(is.na(x)) - 1)[is.na(x)])

答案 1 :(得分:1)

你可以尝试

f1 <- function(x){
   x1 <- is.na(x)
   rl <- rle(x1)
   x[x1] <- with(rl, sequence(lengths[values]))-1
 x}

f1(x)
# [1]  1  2  0  1  2  3  7  8  9 10

f1(xN)
# [1]  1  0  1  2  3  6  7  8  0  1  2  3  4  5  6 16 17 18 19 20

更新

如果你想要一个类似于@Jonas帖子的第二个案例的结果&#34; xN&#34;

indx <- is.na(xN)
xN[indx] <- seq_along(xN[indx])-1
xN
# [1]  1  0  1  2  3  6  7  8  4  5  6  7  8  9 10 16 17 18 19 20

数据

x <-  c(1L, 2L, NA, NA, NA, NA, 7L, 8L, 9L, 10L)
xN <- c(1L, NA, NA, NA, NA, 6L, 7L, 8L, NA, NA, NA, NA, NA, NA, NA, 
    16L, 17L, 18L, 19L, 20L)