Lấp đầy khoảng trống bằng cách sử dụng hàng xóm gần nhất


8

Tôi muốn điền các giá trị NA bằng các giá trị trung bình của các lân cận gần nhất:

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

Câu trả lời:


14

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)

Cảm ơn, tôi nghĩ rằng chức năng này có ý nghĩa của mỗi 3 x 3 pixel và làm mịn toàn bộ raster. Tôi chỉ muốn lấp đầy các khoảng trống của ô NA.
Geo-sp

Có, nhưng bạn có thể viết hàm riêng chỉ thay thế các giá trị NA. Trong trường hợp này na.rm sẽ là FALSE. Đây là những gì các cuộc tranh luận thú vị là cho.
Jeffrey Evans

Cảm ơn câu trả lời! Bạn có biết làm thế nào tôi có thể áp dụng điều này cho một raster stack? Tôi muốn sử dụng nó cho mỗi lớp trong ngăn xếp. Cảm ơn!
Geo-sp

Bạn sẽ phải lặp qua ngăn xếp bằng vòng lặp for và chỉ mục và thay thế từng raster trong ngăn xếp (ví dụ: r [[1]] <- my.feft (r [[1]])) hoặc tạo ngăn xếp mới với mỗi raster đầy.
Jeffrey Evans

1
Nếu bạn muốn làm điều này trong R, có khả năng bạn sẽ phải thực hiện nhiều đường chuyền để điền vào tất cả các khoảng trống. Tuy nhiên, đây không phải là một câu trả lời rất thỏa mãn cho việc lấp đầy các khu vực đại diện cho các khoảng trống dữ liệu lớn. Một cách tiếp cận nội suy chắc chắn sẽ tạo ra kết quả tốt hơn. Không mã hóa một mô hình cụ thể trong R, không có giải pháp nào ngoài hộp. Có một thói quen điền nút dựa trên nội suy có sẵn trong SAGA GIS.
Jeffrey Evans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.