Reemplazo de NA en R con el valor más cercano

Estoy buscando algo similar ana.locf() en elzoo paquete, pero en lugar de usar siempre elanterior no-NA valor me gustaría usar elmás cercano no-NA valor. Algunos datos de ejemplo:

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

ReemplazoNA conna.locf (3 se lleva adelante):

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

yna.locf confromLast ajustado aTRUE (5 se lleva hacia atrás):

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

Pero deseo que elmás cercano no-NA Valor a utilizar. En mi ejemplo, esto significa que los 3 deben ser llevados a la primeraNA, y el 5 debe llevarse hacia atrás al segundoNA:

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

Tengo una solución codificada, pero quería asegurarme de que no estaba reinventando la rueda. ¿Hay algo que ya está flotando alrededor?

Para su información, mi código actual es el siguiente. Tal vez si nada más, alguien puede sugerir cómo hacerlo más eficiente. Siento que me estoy perdiendo una manera obvia de mejorar esto:

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

Para responder a las preguntas de smci a continuación:

No, cualquier entrada puede ser NASi todos son NA, déjalos como están.No. Mi solución actual tiene como valor predeterminado el valor más cercano a la izquierda, pero no importaEstas filas son típicamente unos pocos cientos de miles de elementos, por lo que en teoría el límite superior sería unos pocos cientos de miles. En realidad, no serían más que unos pocos aquí y allá, típicamente uno solo.

Actualizar Así que resulta que vamos en una dirección totalmente diferente, pero esta fue una discusión interesante. ¡Gracias a todos!

Respuestas a la pregunta(6)

Su respuesta a la pregunta