Возвращение значений после последнего NA в векторе - PullRequest
0 голосов
/ 26 марта 2019

Возвращение значений после последнего 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 ]

3 голосов
/ 26 марта 2019

Вы можете обнаружить последние NA с помощью which и добавить 1, чтобы получить индекс после последних NA и индекс до length(v1):

 v1[(max(which(is.na(v1)))+1):length(v1)]
[1]  7  8  9 10 11 12
2 голосов
/ 26 марта 2019
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)
2 голосов
/ 26 марта 2019

Вы можете обнаружить последние 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)
1 голос
/ 26 марта 2019

Вот альтернативное решение, которое не использует индексы и только векторизованные операции:

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

Идея состоит в том, чтобы использовать cumprod для заполнения полей, отличных от NA, от последнего до конца.Это не очень полезное решение само по себе (я призываю вас использовать более очевидное решение на основе диапазона индексов из других ответов), но оно показывает некоторые интересные приемы.

1 голос
/ 26 марта 2019

Следующее будет делать то, что вы хотите.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...