返回向量中最后一个 NA 之后的值



返回向量中最后一个 NA 之后的值

我可以从向量中删除所有 NA 值

v1 <- c(1,2,3,NA,5,6,NA,7,8,9,10,11,12)
v2 <- na.omit(v1)
v2

但是我如何仅在最后一个 NA 之后返回带有值的向量

c( 7,8,9,10,11,12)

谢谢你的帮助。

您可以使用 which 检测最后的NA并加 1 以使索引超过最后一个NA和索引直到length(v1)

 v1[(max(which(is.na(v1)))+1):length(v1)]
[1]  7  8  9 10 11 12

下面是不使用索引而仅使用矢量化操作的替代解决方案:

after_last_na = as.logical(rev(cumprod(rev(! is.na(v1)))))
v1[after_last_na]

这个想法是使用cumprod从最后一个到最后一个填充非NA字段。它本身并不是一个非常有用的解决方案(我敦促您使用其他答案中更明显的、基于索引范围的解决方案(,但它展示了一些有趣的技术。

您可以使用

which检测最后的NA

v1[(tail(which(is.na(v1)), 1) + 1):length(v1)]
# [1]  7  8  9 10 11 12

然而,正如@MrFlick指出的那样,最一般的似乎是这样的:

tail(v1, -tail(which(is.na(v1)), 1))
# [1]  7  8  9 10 11 12

这也正确处理了以下情况:

v1[13] <- NA
tail(v1, -tail(which(is.na(v1)), 1))
# numeric(0)

为了获得空NA情况,

v1 <- 1:13

我们可以做到

if (any(is.na(v1))) tail(v1, -tail(which(is.na(v1)), 1)) else v1
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13

数据

v1 <- c(1, 2, 3, NA, 5, 6, NA, 7, 8, 9, 10, 11, 12)
v1 <- c(1,2,3,NA,5,6,NA,7,8,9,10,11,12)
v1[seq_along(v1) > max(0, tail(which(is.na(v1)), 1))]
#[1]  7  8  9 10 11 12
v1 = 1:5
v1[seq_along(v1) > max(0, tail(which(is.na(v1)), 1))]
#[1] 1 2 3 4 5
v1 = c(1:5, NA)
v1[seq_along(v1) > max(0, tail(which(is.na(v1)), 1))]
#integer(0)

以下内容将执行您想要的操作。

i <- which(is.na(v1))
if(i[length(i)] < length(v1)){
  v1[(i[length(i)] + 1):length(v1)]
}else{
  NULL
}
#[1]  7  8  9 10 11 12

最新更新