在栅格对象中,如果一个单元格中的 NA 太多,如何将平均值设置为 NA?

问题描述 投票:0回答:2

我正在处理光栅格式的环境数据。我有一个 Raster 对象,其中每一层都对应于特定的观察时间步长。

最终目标是计算时间维度上每个单元格的平均值。但是,由于我的数据中有很多 NA,如果特定单元格的时间序列中有太多 NA,我想将平均值设置为 NA。通过这种方式,我确保计算出的平均值是稳健的,即来自足够数量的实际观察结果(例如,我没有一个平均值是用 100 个观察结果计算的,另一个平均值是基于 3 个观察结果和 97 个 NA)。

在下面的示例中,如果时间序列中有 2 个或更多 NA,我想设置 NA 的平均值。

s <- rast(ncol=10, nrow=10, nlyr=30)
set.seed(1)
values(s) <- rnorm(size(s), 10)
s[3] <- NaN # setting a cell to NA (across all layers)
s[[4]] <- NaN # setting a layer to NA
s[[1]][1] <- NaN # setting some random individual cells to NA
s[[5]][4] <- NaN
mn <- mean(s, na.rm = TRUE) # na.rm = FALSE would just set to NA any mean containing a single NA or more
r mean na r-raster terra
2个回答
1
投票

您可以使用

app
(有点像
SpatRaster
apply
版本)跨层查找每个单元格中的 NA 数量,然后将具有太多 NA 的
mn
栅格的单元格设置为 NA:

nas <- app(s, \(x) sum(is.na(x)))
mn[nas >= 2] <- NA

round(as.matrix(mn, wide=T))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#  [1,]   NA   10   NA   NA   10   10   10   10   10    10
#  [2,]   10   10   10   10   10   10   10   10   10    11
#  [3,]   10   10   10   10   10   10   10   10   10    10
#  [4,]   10   10   10   10   10   10   10   10   10    10
#  [5,]   10   10   10   10   10   10   10   10   10    10
#  [6,]   10   10   10   10   10   10   10   10   10    10
#  [7,]   10   10   10   10   10   10   10   10   10    10
#  [8,]   10   10   10   10   10   10   10   10   10    10
#  [9,]   10   10   10   10   10   10   10   10   10    10
# [10,]   10   10   10   10   10   10   10   10   10    10

我不得不稍微修改你的初始代码以使其工作:

library(terra)
s <- rast(ncol=10, nrow=10, nlyr=30)
set.seed(1)
values(s) <- rnorm(size(s), 10)
s[3] <- NaN 
s[[4]][] <- NaN   # here I had to add []
s[[1]][1] <- NaN
s[[5]][4] <- NaN
mn <- mean(s, na.rm = TRUE) 

0
投票

示例数据

library(terra)
s <- rast(ncol=10, nrow=10, nlyr=30)
set.seed(1)
v <- rnorm(size(s), 10)
v[sample(length(v), 100)] <- NA
values(s) <- v

您可以统计 NA,然后使用阈值来屏蔽原始数据

sna <- sum(is.na(s))
x <- mask(s, sna > 2, maskvalue=TRUE)
© www.soinside.com 2019 - 2024. All rights reserved.