如何统一栅格堆栈中非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))
我希望 r1
和 r2
具有相同数量的非 NA 单元格。我有两个以上的光栅,所以我想知道我是否可以对大量文件进行处理。
同时使用 raster 和 terra 可能会有点混乱,所以我将只使用 terra
(但你可以对 raster
做同样的事情,而是使用 stack
c
和 cellStats
而不是 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
。例如 sum
、diff
、prod
、mean
或 app
.
m <- sum(r)
x <- mask(r, m)
global(!(is.na(x)), sum, na.rm=TRUE)
我有分辨率和范围相同但 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))
我希望 r1
和 r2
具有相同数量的非 NA 单元格。我有两个以上的光栅,所以我想知道我是否可以对大量文件进行处理。
同时使用 raster 和 terra 可能会有点混乱,所以我将只使用 terra
(但你可以对 raster
做同样的事情,而是使用 stack
c
和 cellStats
而不是 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
。例如 sum
、diff
、prod
、mean
或 app
.
m <- sum(r)
x <- mask(r, m)
global(!(is.na(x)), sum, na.rm=TRUE)