Захват значений до NA в кадре данных

#r

Вопрос:

У меня есть фрейм данных, как показано ниже. Я пытаюсь уловить значение, которое предшествует всем значениям NA. Например, в приведенном ниже фрейме данных есть значения включения и выключения NA. Но мне нужно зафиксировать значение, равное 77, потому что после этого значения все являются NA, и между ними нет значения. Может ли кто-нибудь помочь мне с логикой, чтобы уловить это?

 asd <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,NA))
 

но если это закончится не НА

asd

 Here it should capture 56 since it is the last value and no NA
 

Ответ №1:

В базе R

 with(asd1, tail(na.omit(a), 1))
#[1] 77
with(asd2, tail(na.omit(a), 1))
#[1] 56
 

Примеры данных

 asd1 <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,NA))
asd2 <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,65,56))
 

Ответ №2:

Вы можете использовать эту функцию

 library(xts)
last_before_na <- function(x){
  if (!is.na(last(x))){
    y = as.numeric(last(x))
    return(c(y, last(which(x == y))))
  } else {
    y = last(na.omit(x[!is.na(x)]))
    return(c(y,last(which(x == y))))
    
  }
  
}



asd <- data.frame(a = c(NA,1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,NA))
last_before_na(asd)

[1] 77 14

asd <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,65,56))
last_before_na(asd)

[1] 56 22
 

еще один 77

 asd <- data.frame(a = c(NA,1,2,NA,3,NA,NA,6,8,3,2,5,77,77,NA,NA,NA,NA,NA,NA,NA,NA))
last_before_na(asd)
[1] 77 14
 

Но я думаю, что так будет лучше..

 xts::last(na.omit(asd))
 

Комментарии:

1. Спасибо. Жаль, что это не заканчивается. Я отредактировал свой вопрос

2. @manup Я редактирую код.

3. И последний вопрос: можем ли мы узнать, к какому индексу(номеру строки) относится это значение? Вот оно 13 (место, где расположено 77)

4. @manup Я редактирую функцию.

5. :)На самом деле я это сделал. Но что, если существует 2 значения, умноженные на 77 ???? Какой индекс для этого потребуется? 🙂