#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 ???? Какой индекс для этого потребуется? 🙂