返回向量中最后一个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)
谢谢您的帮助。
答案 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
字段。它本身并不是一个非常有用的解决方案(我敦促您使用其他答案中更为明显的基于索引范围的解决方案),但它显示了一些有趣的技术。