Isi celah menggunakan tetangga terdekat

8

Saya ingin mengisi nilai NA menggunakan nilai rata-rata tetangga terdekat:

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

Jawaban:

14

Anda dapat mengisi nilai-nilai NA menggunakan fungsi fokus dengan argumen na.rm diatur ke FALSE dan pad ke TRUE.

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

Berfungsi untuk mengganti nilai fokus dengan rata-rata jendela 3x3 jika NA. Jika ukuran jendela meningkatkan nilai indeks [i] perlu berubah juga (mis., Untuk jendela 5x5 indeks akan menjadi 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) )
  }
}  

Lewati fungsi fill.na ke raster :: focal dan periksa hasilnya. Argumen pad membuat baris / kolom virtual nilai NA untuk menjaga panjang vektor konstan di sepanjang tepi raster. Inilah sebabnya mengapa kita selalu dapat mengharapkan nilai kelima vektor menjadi nilai fokus dalam jendela 3x3 dengan demikian, indeks i = 5 pada fungsi 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
sumber
Terima kasih, saya pikir fungsi ini mengambil rata-rata setiap 3 kali 3 piksel dan menghaluskan seluruh raster. Saya ingin mengisi celah sel NA saja.
Geo-sp
Ya, tetapi Anda dapat menulis fungsi Anda sendiri yang hanya menggantikan nilai-nilai NA. Dalam hal ini na.rm akan menjadi SALAH. Inilah gunanya argumen yang menyenangkan.
Jeffrey Evans
Terima kasih atas jawabannya! Anda tahu bagaimana saya bisa menerapkan ini ke tumpukan raster? Saya ingin menggunakannya untuk setiap lapisan dalam tumpukan. Terima kasih!
Geo-sp
Anda harus melakukan iterasi melalui stack menggunakan for for dan index serta mengganti setiap raster di stack (mis., R [[1]] <- my.function (r [[1]])) atau membuat tumpukan baru dengan setiap raster yang diisi.
Jeffrey Evans
1
Jika Anda ingin melakukan ini di R, kemungkinan Anda harus melakukan beberapa lintasan untuk mengisi semua celah. Namun, ini bukan jawaban yang sangat memuaskan untuk mengisi area yang mewakili kekosongan data besar. Pendekatan interpolasi tentu akan menghasilkan hasil yang lebih baik. Tanpa mengkode model tertentu dalam R, tidak ada solusi out of the box. Ada rutinitas pengisian nodata berbasis interpolasi yang tersedia di SAGA GIS.
Jeffrey Evans