我想在向量中的值之前直接计算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]
编辑 - 我添加了最后一个大括号并修正了输出值
答案 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)