示例数据:
library(raster) r <- raster(nrow=5, ncol=5, vals=1:25) set.seed(20181801) s <- stack(lapply(1:5, function(i) {r[sample(25, 15)] <- NA; r}))
计数 NA 跨层的值
NA
i <- sum(is.na(s))
重新分类使得所有单元格值变为零,除非所有图层都具有 NA 值
nl <- nlayers(s) j <- reclassify(i, rbind(c(0, nl-1, 0), c(nl, nl ,NA)), right=NA)
使用 cover 取代 NA 单元格中的值为零,其中至少有一个图层具有值
cover
z <- cover(s, j)
替代方法 calc :
calc
编写一个能够为矢量或矩阵执行所需操作的函数:
f <- function(x) { i <- sum(is.na(x)) if (i > 0 & i < 5) { x[is.na(x)] <- 0 } x } zz <- calc(s, f)
使用这些函数而不是更直接的R语言的一个重要原因是它们都是内存安全的。
顺便提一句,你提到这一点 r[is.na(r[])] <- 0 由于内存限制而无效。通过做 is.na(r[]) 你创建了一个所有值的向量,从而要求发生这个问题。你可以尝试 r[is.na(r)] <- 0 。
r[is.na(r[])] <- 0
is.na(r[])
r[is.na(r)] <- 0