Zastępowanie NA w R z najbliższą wartością

Szukam czegoś podobnegona.locf() wzoo pakiet, ale zamiast zawsze używaćpoprzedni nie-NA wartość Chciałbym użyćnajbliższy nie-NA wartość. Niektóre przykładowe dane:

<code>dat <- c(1, 3, NA, NA, 5, 7)
</code>

ZastępujeNA zna.locf (3 jest przenoszone dalej):

<code>library(zoo)
na.locf(dat)
# 1 3 3 3 5 7
</code>

ina.locf zfromLast UstawićTRUE (5 jest przenoszonych do tyłu):

<code>na.locf(dat, fromLast = TRUE)
# 1 3 5 5 5 7
</code>

Ale życzęnajbliższy nie-NA wartość do użycia. W moim przykładzie oznacza to, że 3 powinny być przeniesione do pierwszegoNA, a 5 powinno być przenoszone do tyłu do drugiegoNA:

<code>1 3 3 5 5 7
</code>

Mam zakodowane rozwiązanie, ale chciałem się upewnić, że nie wymyśliłem nowego koła. Czy jest już coś, co się unosi?

FYI, mój obecny kod jest następujący. Być może, jeśli nie ma nic innego, ktoś może zasugerować, jak sprawić, by był bardziej wydajny. Czuję, że brakuje mi oczywistego sposobu na poprawę tego:

<code>  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]]
</code>

Aby odpowiedzieć na pytania smci poniżej:

Nie, każdy wpis może być NAJeśli wszyscy są NA, zostaw ich bez zmianNie. Moje obecne rozwiązanie domyślnie ustawia się na lewą najbliższą wartość, ale to nie ma znaczeniaWiersze te mają zwykle kilkaset tysięcy elementów, więc teoretycznie górna granica wynosiłaby kilkaset tysięcy. W rzeczywistości nie byłoby więcej niż kilka tu i tam, zazwyczaj jeden.

Aktualizacja Okazuje się więc, że idziemy zupełnie w innym kierunku, ale to była nadal interesująca dyskusja. Dziękuje wszystkim!

questionAnswers(6)

yourAnswerToTheQuestion