我正在处理光栅格式的环境数据。我有一个 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
您可以使用
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)
示例数据
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)