Я ищу что-то похожее на na.locf()
в пакете zoo
, но вместо того, чтобы всегда использовать предыдущее значение, отличное от NA
, я хотел бы использовать ближайшее значение, отличное от NA
. Некоторые примеры данных :
dat <- c(1, 3, NA, NA, 5, 7)
Замена NA
на na.locf
(3 переносится вперед):
library(zoo)
na.locf(dat)
# 1 3 3 3 5 7
и na.locf
на fromLast
установить в TRUE
(5 переносится назад):
na.locf(dat, fromLast = TRUE)
# 1 3 5 5 5 7
Но я хочу, чтобы ближайшеезначение, отличное от NA
, использовалось. В моем примере это означает, что 3 должны быть перенесены вперед к первому NA
, а 5 должны быть перенесены назад ко второму NA
:
1 3 3 5 5 7
У меня есть закодированное решение, но я хотел убедиться что я не изобретал велосипед. Что-то уже витает вокруг?
К вашему сведению, мой текущий код выглядит следующим образом. Возможно, если ничего другого, кто-то может предложить, как сделать его более эффективным. чувствую, что я упустил очевидный способ улучшить это:
na.pos <- which(is.na(dat))
if (length(na.pos) == length(dat)) {
return(dat)
}
non.na.pos <- setdiff(seq_along(dat), na.pos)
nearest.non.na.pos <- sapply(na.pos, function(x) {
return(which.min(abs(non.na.pos - x)))
})
dat[na.pos] <- dat[non.na.pos[nearest.non.na.pos]]
Чтобы ответить на вопросы smci ниже:
ОбновлениеПолучается, что мы идем совсем в другом направлении, но дискуссия все равно была интересной. Спасибо всем!