【问题标题】:How to unify the number of non-NA cells in raster stack?如何统一栅格堆栈中非 NA 像元的数量?
【发布时间】:2021-05-19 07:40:55
【问题描述】:

我的光栅文件具有相同的分辨率和范围,但 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 单元格。我有两个以上的栅格,所以我想知道是否可以对大量文件进行此操作。

【问题讨论】:

  • 你能给出一个示例数据集和预期的输出吗?
  • @slamballais 我更新了我的帖子

标签: r raster r-raster


【解决方案1】:

同时使用 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)

【讨论】:

  • 它有效,非常感谢,但你能解释一下你为什么选择参数 maskvalue=1 吗?
  • 我使用0/1 (FALSE/TRUE) 层到mask 条件(any(is.na(x))TRUE 的单元格,因此使用maskvalue=1 而不是默认的@987654345 @.maskvalue=TRUE 也可以。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多