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