通过向量向后循环
looping backwards through a vector
我想计算向量中某个值之前的 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]
}
}
这个returns
[1,2,-1,-1,-1,-1,7,8,9,10]
我想要返回的值是
[1,2,0,1,2,3,7,8,9,10]
编辑 - 我添加了最后一个大括号并修复了输出值
怎么样:
replace(x, is.na(x), (cumsum(is.na(x)) - 1)[is.na(x)])
你可以试试
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 post 第二种情况“xN”的结果
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)
我想计算向量中某个值之前的 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]
}
}
这个returns
[1,2,-1,-1,-1,-1,7,8,9,10]
我想要返回的值是
[1,2,0,1,2,3,7,8,9,10]
编辑 - 我添加了最后一个大括号并修复了输出值
怎么样:
replace(x, is.na(x), (cumsum(is.na(x)) - 1)[is.na(x)])
你可以试试
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 post 第二种情况“xN”的结果
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)