Rellene los huecos usando vecinos más cercanos

8

Quiero completar los valores de NA utilizando los valores promedio de los vecinos más cercanos:

r <- raster(matrix(1:16, nrow=8, ncol=8))
r[r==12] <- NA
Geo-sp
fuente

Respuestas:

14

Puede completar los valores de NA utilizando la función focal con el argumento na.rm establecido en FALSE y el pad en TRUE.

library(raster)
  r <- raster(matrix(1:16, nrow=8, ncol=8))
  r[r==12] <- NA

Función para reemplazar el valor focal con la media de una ventana de 3x3 si NA. Si el tamaño de la ventana aumenta, el valor del índice [i] también debe cambiar (por ejemplo, para una ventana de 5x5, el índice sería 13).

fill.na <- function(x, i=5) {
  if( is.na(x)[i] ) {
    return( round(mean(x, na.rm=TRUE),0) )
  } else {
    return( round(x[i],0) )
  }
}  

Pase la función fill.na a raster :: focal y verifique los resultados. El argumento pad crea filas / columnas virtuales de valores de NA para mantener constante la longitud del vector a lo largo de los bordes del ráster. Es por eso que siempre podemos esperar que el quinto valor del vector sea el valor focal en una ventana de 3x3, por lo tanto, el índice i = 5 en la función fill.na.

r2 <- focal(r, w = matrix(1,3,3), fun = fill.na, 
            pad = TRUE, na.rm = FALSE )

as.matrix(r)
as.matrix(r2)
Jeffrey Evans
fuente
Gracias, creo que esta función toma la media de cada 3 por 3 píxeles y suaviza todo el ráster. Solo quiero llenar los huecos de la celda de NA.
Geo-sp
Sí, pero puede escribir su propia función que solo reemplaza los valores de NA. En este caso, na.rm sería FALSO. Para eso es el argumento divertido.
Jeffrey Evans
¡Gracias por la respuesta! ¿Sabes cómo puedo aplicar esto a una pila ráster? Quiero usar eso para cada capa en la pila. ¡Gracias!
Geo-sp
Tendrá que recorrer la pila utilizando un bucle for y un índice, y reemplazar cada ráster en la pila (por ejemplo, r [[1]] <- my.function (r [[1]])) o crear un nueva pila con cada trama llena.
Jeffrey Evans
1
Si desea hacer esto en R, es probable que tenga que realizar múltiples pases para llenar todos los huecos. Sin embargo, esta no es una respuesta muy satisfactoria para llenar áreas que representan grandes vacíos de datos. Un enfoque de interpolación ciertamente produciría mejores resultados. Sin codificar un modelo específico en R, no hay soluciones listas para usar. Hay una rutina de llenado de nodata basada en interpolación disponible en SAGA GIS.
Jeffrey Evans