Я ищу что-то похожее на na.locf() в пакете zoo, но вместо того, чтобы всегда использовать предыдущее значение, отличное от NA, я бы хотел использовать ближайшее значение NA, например:
1 3 NA NA 5 7
с na.locf:
1 3 3 3 5 7
и na.locf: отLast установлено до TRUE:
1 3 5 5 5 7
но я ищу:
1 3 3 5 5 7
У меня есть решение, закодированное, но я хотел убедиться, что я не изобретаю колесо. Есть что-то уже плавающее вокруг?
FYI, мой текущий код выглядит следующим образом. Возможно, если ничего другого, кто-то может предложить, как сделать его более эффективным. Я чувствую, что у меня отсутствует очевидный способ улучшить это:
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 ниже:
- Нет, любая запись может быть NA
- Если все являются NA, оставьте их как есть
- Нет. Мое текущее решение по умолчанию соответствует ближайшему значению lefthand, но это не имеет значения.
- Обычно эти строки составляют несколько сотен тысяч элементов, поэтому теоретически верхняя граница должна составлять несколько сотен тысяч. На самом деле это будет не более, чем несколько здесь и там, как правило, один.
Обновить. Оказывается, мы идем в другом направлении, но это было интересное обсуждение. Спасибо всем!