Ersetzen von NAs in R durch den nächsten Wert

Ich bin auf der Suche nach etwas ähnlichemna.locf() in demzoo Paket, sondern immer mit derBisherige nicht-NA Ich würde das gerne nutzennächste nicht-NA Wert. Einige Beispieldaten:

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

ErsetzenNA mitna.locf (3 wird vorgetragen):

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

undna.locf mitfromLast einstellenTRUE (5 wird rückwärts getragen):

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

Aber ich wünsche dasnächste nicht-NA zu verwendender Wert. In meinem Beispiel bedeutet dies, dass die 3 auf die erste vorgetragen werden sollNA, und die 5 sollte auf die Sekunde zurückgetragen werdenNA:

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

Ich habe eine Lösung programmiert, wollte aber sicherstellen, dass ich das Rad nicht neu erfinde. Ist da schon etwas im Umlauf?

Zu Ihrer Information, mein aktueller Code ist wie folgt. Vielleicht, wenn nichts anderes, kann jemand vorschlagen, wie man es effizienter macht. Ich habe das Gefühl, dass mir ein offensichtlicher Weg fehlt, um dies zu verbessern:

<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>

Um die folgenden Fragen von smci zu beantworten:

Nein, jeder Eintrag kann NA seinWenn alle NA sind, lass sie wie sie sindNein. Meine aktuelle Lösung verwendet standardmäßig den nächstgelegenen Wert auf der linken Seite, aber das spielt keine RolleDiese Zeilen bestehen normalerweise aus ein paar hunderttausend Elementen. Theoretisch wäre die Obergrenze also ein paar hunderttausend. In Wirklichkeit würde es hier und da nicht mehr als ein paar geben, typischerweise ein einziges.

Aktualisieren Es stellt sich also heraus, dass wir insgesamt in eine andere Richtung gehen, aber dies war immer noch eine interessante Diskussion. Vielen Dank an alle!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage