问题
With the raster below, with an increased number of NA values
library(raster)
filename <- system.file("external/test.grd", package="raster")
r <- raster(filename)
r[r<300] <- NA
summary(getValues(r))
is it possible to 'fill in' only the NA cells? I have been using this helpful post but as seen below, NA values remain in the final product.
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) )
}
}
r2 <- focal(r, w = matrix(1,3,3), fun = fill.na,
pad = TRUE, na.rm = FALSE )
summary(getValues(r2))
I suspect the issue is the contiguous areas with NA values and am wondering if there are other options for 'filling in' gaps of missing data.
回答1:
one way would be to enlarge your focus window. You can do so by modifying the "fill.NA" function to take a width
argument and computing the position of the center pixel on the fly:
fill.na <- function(x) {
center = 0.5 + (width*width/2)
if( is.na(x)[center] ) {
return( round(mean(x, na.rm=TRUE),0) )
} else {
return( round(x[center],0) )
}
}
then:
width = 9
r2 <- focal(r, w = matrix(1,width,width), fun = fill.na,
pad = TRUE, na.rm = FALSE)
summary(getValues(r2))
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
300.0 339.0 408.0 488.7 574.5 1806.0 4661
You can see that the number of NAs is going down.
However, be aware that since your "holes" share the same NA value of the area outside the raster, this will also expand your raster on the outer side, giving you bogus values. see for example:
width = 15
r2 <- focal(r, w = matrix(1,width,width), fun = fill.na,
pad = TRUE, na.rm = FALSE)
plot(rast)
Therefore, you'd have to find a way to distinguish between "true" NA values, and values outside the extent of the dataset.
HTH.
来源:https://stackoverflow.com/questions/45641168/fill-in-gaps-e-g-not-single-cells-of-na-values-in-raster-using-a-neighborhood