如何统一栅格堆栈中非NA单元格的数量?

How to unify the number of non-NA cells in raster stack?

我有分辨率和范围相同但 NA 数量不同的光栅文件。我想统一它们之间的 NA 数量。如果在所有栅格文件中都不是 NA,是否可以通过将像元视为非 NA 来实现?

举个例子:

   library(raster)
library(terra)

f <- system.file("external/test.grd", package="raster")
r1 <- raster(f)
r2 <- calc(r1, fun=function(x){ x[x < 500] <- NA; return(x)} )
r1 <- calc(r1, fun=function(x){ x[x > 1200] <- NA; return(x)} )
raste <-  rast(r1)
rNA <- terra:: global(!(is.na(raste)), sum, na.rm=TRUE)
print(paste0("Non-NA of r1", rNA))
raste <-  rast(r2)
rNA <- terra:: global(!(is.na(raste)), sum, na.rm=TRUE)
print(paste0("Non-NA of r2", rNA))

我希望 r1r2 具有相同数量的非 NA 单元格。我有两个以上的光栅,所以我想知道我是否可以对大量文件进行处理。

同时使用 raster 和 terra 可能会有点混乱,所以我将只使用 terra(但你可以对 raster 做同样的事情,而是使用 stack ccellStats 而不是 global

您的示例数据

library(terra)
f <- system.file("external/test.grd", package="raster")
r <- rast(f)
r1 <- clamp(r, upper=1200, values=FALSE)
r2 <- clamp(r, lower=500, values=FALSE)

global(!(is.na(r1)), sum)
#       sum
#lyr.1 3145
global(!(is.na(r2)), sum)
#      sum
#lyr.1 802

解决方案:

r <- c(r1, r2)
names(r) <- c("r1", "r2")

m <- any(is.na(r))
x <- mask(r, m, maskvalue=1)

global(!(is.na(x)), sum, na.rm=TRUE)
#   sum
#r1 769
#r2 769

我喜欢使用 any(is.na()) 因为它清楚地表明了意图。

但是您可以通过许多其他方式之一组合这些层。只要您不使用 na.rm=TRUE,其中一层中带有 NA 的单元格将在输出中显示为 NA。例如 sumdiffprodmeanapp.

m <- sum(r)
x <- mask(r, m)
global(!(is.na(x)), sum, na.rm=TRUE)