Câu trả lời:
Bạn có thể điền các giá trị NA bằng cách sử dụng hàm tiêu cự với đối số na.rm được đặt thành FALSE và đệm thành TRUE.
library(raster)
r <- raster(matrix(1:16, nrow=8, ncol=8))
r[r==12] <- NA
Chức năng thay thế giá trị tiêu cự bằng giá trị trung bình của cửa sổ 3x3 nếu NA. Nếu kích thước cửa sổ tăng giá trị chỉ mục [i] cũng cần thay đổi (ví dụ: đối với cửa sổ 5x5, chỉ mục sẽ là 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) )
}
}
Truyền hàm fill.na cho raster :: focal và kiểm tra kết quả. Đối số pad tạo các hàng / cột ảo của các giá trị NA để giữ cho độ dài vectơ không đổi dọc theo các cạnh của raster. Đây là lý do tại sao chúng ta luôn có thể mong đợi giá trị thứ năm của vectơ là giá trị tiêu cự trong cửa sổ 3x3, do đó, chỉ số i = 5 trong hàm fill.na.
r2 <- focal(r, w = matrix(1,3,3), fun = fill.na,
pad = TRUE, na.rm = FALSE )
as.matrix(r)
as.matrix(r2)