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

时间:2019-03-26 17:52:28

标签: r

返回向量中最后一个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)

谢谢您的帮助。

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您可以用NA检测到最后一个which

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)

答案 2 :(得分:2)

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)

答案 3 :(得分:1)

以下内容将满足您的需求。

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

答案 4 :(得分:1)

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

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

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