Замена NA в R ближайшим значением

Я ищу что-то похожее на 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 ниже:

  1. Нет, любая запись может быть NA
  2. Если все NA, оставьте их как есть
  3. Нет. текущее решение по умолчанию принимает левое ближайшее значение, но это не имеет значения.
  4. Обычно эти строки состоят из нескольких сотен тысяч элементов, поэтому теоретически верхняя граница будет составлять несколько сотен тысяч.На самом деле их было бы не больше, чем несколько здесь и там, обычно один.

ОбновлениеПолучается, что мы идем совсем в другом направлении, но дискуссия все равно была интересной. Спасибо всем!

27
задан Henrik 22 July 2018 в 20:50
поделиться