Combler les lacunes en utilisant les voisins les plus proches

8

Je veux remplir les valeurs NA en utilisant les valeurs moyennes des voisins les plus proches:

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

Réponses:

14

Vous pouvez remplir les valeurs NA à l'aide de la fonction focale avec l'argument na.rm défini sur FALSE et le pad sur TRUE.

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

Fonction pour remplacer la valeur focale par la moyenne d'une fenêtre 3x3 si NA. Si la taille de la fenêtre augmente, la valeur d'index [i] doit également changer (par exemple, pour une fenêtre 5x5, l'index serait 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) )
  }
}  

Passez la fonction fill.na à raster :: focal et vérifiez les résultats. L'argument pad crée des lignes / colonnes virtuelles de valeurs NA pour maintenir la longueur du vecteur constante le long des bords du raster. C'est pourquoi on peut toujours s'attendre à ce que la cinquième valeur du vecteur soit la valeur focale dans une fenêtre 3x3 donc, l'indice i = 5 dans la fonction 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
la source
Merci, je pense que cette fonction prend la moyenne des 3 x 3 pixels et lisse tout le raster. Je veux seulement combler les lacunes de la cellule NA.
Geo-sp
Oui, mais vous pouvez écrire votre propre fonction qui ne remplace que les valeurs NA. Dans ce cas, na.rm serait FAUX. C'est à cela que sert l'argument amusant.
Jeffrey Evans
Merci d'avoir répondu! savez-vous comment je peux l'appliquer à une pile raster? Je veux l'utiliser pour chaque couche de la pile. Merci!
Geo-sp
Vous devrez parcourir la pile à l'aide d'une boucle for et d'un index et remplacer chaque raster de la pile (par exemple, r [[1]] <- my.function (r [[1]])) ou créer un nouvelle pile avec chaque raster rempli.
Jeffrey Evans
1
Si vous voulez le faire dans R, vous devrez probablement effectuer plusieurs passes afin de combler toutes les lacunes. Cependant, ce n'est pas une réponse très satisfaisante pour remplir des zones qui représentent de grands vides de données. Une approche par interpolation produirait certainement de meilleurs résultats. Sans coder un modèle spécifique dans R, il n'y a pas de solutions prêtes à l'emploi. Il existe une routine de remplissage de nodates basée sur l'interpolation disponible dans SAGA GIS.
Jeffrey Evans