Füllen Sie die Lücken mit den nächsten Nachbarn

8

Ich möchte die NA-Werte mit den Durchschnittswerten der nächsten Nachbarn füllen:

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

Antworten:

14

Sie können die NA-Werte mithilfe der Fokusfunktion mit dem Argument na.rm auf FALSE und dem Pad auf TRUE eingeben.

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

Funktion zum Ersetzen des Brennwerts durch den Mittelwert eines 3x3-Fensters bei NA. Wenn sich die Fenstergröße erhöht, muss sich auch der Indexwert [i] ändern (z. B. für ein 5x5-Fenster wäre der Index 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) )
  }
}  

Übergeben Sie die Funktion fill.na an raster :: focal und überprüfen Sie die Ergebnisse. Das Pad-Argument erstellt virtuelle Zeilen / Spalten mit NA-Werten, um die Vektorlänge entlang der Kanten des Rasters konstant zu halten. Aus diesem Grund können wir immer erwarten, dass der fünfte Wert des Vektors der Brennwert in einem 3x3-Fenster ist, also der Index i = 5 in der Funktion 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
quelle
Vielen Dank, ich denke, diese Funktion nimmt den Mittelwert aller 3 x 3 Pixel und glättet das gesamte Raster. Ich möchte nur die Lücken der NA-Zelle füllen.
Geo-sp
Ja, aber Sie können Ihre eigene Funktion schreiben, die nur NA-Werte ersetzt. In diesem Fall wäre na.rm FALSE. Dafür ist das lustige Argument da.
Jeffrey Evans
Danke für die Antwort! Wissen Sie, wie ich dies auf einen Rasterstapel anwenden kann? Ich möchte das für jede Ebene im Stapel verwenden. Vielen Dank!
Geo-sp
Sie müssen den Stapel mit einer for-Schleife und einem Index durchlaufen und entweder jedes Raster im Stapel ersetzen (z. B. r [[1]] <- my.function (r [[1]])) oder ein erstellen neuer Stapel mit jedem gefüllten Raster.
Jeffrey Evans
1
Wenn Sie dies in R tun möchten, müssen Sie wahrscheinlich mehrere Durchgänge ausführen, um alle Lücken zu füllen. Dies ist jedoch keine sehr zufriedenstellende Antwort für das Füllen von Bereichen, die große Datenlücken darstellen. Ein Interpolationsansatz würde sicherlich zu besseren Ergebnissen führen. Ohne die Codierung eines bestimmten Modells in R gibt es keine sofort einsatzbereiten Lösungen. In SAGA GIS steht eine interpolationsbasierte Knotenfüllroutine zur Verfügung.
Jeffrey Evans