R 在光栅中,如果其他光栅在该单元格中有值,则将NA设置为零

R 在光栅中,如果其他光栅在该单元格中有值,则将NA设置为零,r,arcgis,raster,R,Arcgis,Raster,我有11个大的光栅文件,包含大约314578920个单元格。其中一些细胞含有钠。如果其他光栅在该特定单元格中有值,我想将NA替换为零。但在所有光栅中包含钠的单元应该是相同的。例如,请参见下图: 我创建了五个光栅(第一行)来说明我的问题(但实际上我有11个光栅)。输出光栅应类似于底行光栅 将所有NA替换为零(即,使用r[is.NA(r[])]这里有一个快速的方法,可以通过所有提供的光栅替换不是NA的NA值。所有提供的光栅中NA的任何单元格都将保持NA(顺便说一句,我假设所有光栅的大小都相同…)

我有11个大的光栅文件,包含大约314578920个单元格。其中一些细胞含有钠。如果其他光栅在该特定单元格中有值,我想将NA替换为零。但在所有光栅中包含钠的单元应该是相同的。例如,请参见下图:

我创建了五个光栅(第一行)来说明我的问题(但实际上我有11个光栅)。输出光栅应类似于底行光栅


将所有NA替换为零(即,使用
r[is.NA(r[])]这里有一个快速的方法,可以通过所有提供的光栅替换不是
NA
NA
值。所有提供的光栅中
NA
的任何单元格都将保持
NA
(顺便说一句,我假设所有光栅的大小都相同…)

我将制作一些更简单的数据。我选择将它们存储在一个列表中,因为这使该解决方案更易于阅读(我认为),但也更易于扩展到您需要的任意多个光栅

set.seed(2)
rs <- lapply(1:2, function(ign) {
  r <- raster(nrow=3, ncol=3)
  r[] <- sample(length(r))
  r
})
光栅内部(正如您可能知道的)只是
数值
向量,因此我将映射每个光栅的
NA
索引

nas <- lapply(rs, function(r) which(is.na(r[])))
nas
# [[1]]
# [1] 1 2
# [[2]]
# [1] 2
nas示例数据:

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

nl <- nlayers(s)
j <- reclassify(i, rbind(c(0, nl-1, 0), c(nl, nl ,NA)), right=NA)
使用
计算的替代方法

编写一个函数,实现向量或矩阵所需的功能:

f <- function(x) {
    i <- sum(is.na(x))
    if (i > 0 & i < 5) {
        x[is.na(x)] <- 0
    }
    x
}

zz <- calc(s, f)

f我对使用光栅不够熟悉,无法自信地创建示例“光栅对象”测试代码。您能提供生成几个小光栅的MWE代码吗?例如,您的单元数为314M并不重要,该代码可以与10x10光栅一起工作,就像与17Kx17K一起工作一样。@r2evans此代码是否满足您的问题:
库(光栅)#load library;r这是一个很好的开始。我把它添加到了您的问题中,以后您只需自己添加到那里即可(除了简单的单行命令外,注释在显示代码时通常很糟糕)。这是一个光栅,您说过要将多个光栅与一些相同、不同的
NA
位置进行比较。您的示例数据应该是自给自足的,因此,如果您需要光栅或单独对象的列表,您需要创建它们。您知道这种转换的频率吗?例如,您对光栅获取的声明“如此之大以至于内存无法处理”将是一个因素,无论生成何种技术将“某些”
NA
s替换为0。也许在这种情况下,您需要(1)一台更大的计算机;(2)更改算法,以便在不填充稀疏矩阵的情况下巧妙地处理这些
NA
s;或(3)还有一些。谢谢。但是最后一个函数给了我错误:
error in(function(r,i):未使用的参数(simplify=dots[[3]][[1]])
。缺少任何内容。我现在已将该函数粘贴到下面的注释中,并在您更正后将其删除。哎呀,我本来应该在发布之前测试它的。删除它,一切正常。(这是对代码的测试后添加。不必要。)是的,我对答案投了赞成票(即接受)。但谁对我原来的问题投了反对票?非常感谢,伙计。对于谁对答案投了反对票,你能告诉我为什么吗?只是想知道什么可能更好(或错误更少)。请编辑您的答案,以便我可以再次投票(只需在代码注释中添加任何单词)。我的电脑昨天挂起。我已接受答案,希望再次投票。问候。
nas <- lapply(nas, setdiff, na_in_all)
nas
# [[1]]
# [1] 1
# [[2]]
# integer(0)
rs <- mapply(function(r,i) {
  if (length(i)) r[i] <- 0
  r
}, rs, nas)
head(rs[[1]])
#   1  2 3
# 1 0 NA 5
# 2 9  7 4
# 3 1  8 3
head(rs[[2]])
#   1  2 3
# 1 5 NA 2
# 2 8  1 7
# 3 3  4 6
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}))
i <- sum(is.na(s))
nl <- nlayers(s)
j <- reclassify(i, rbind(c(0, nl-1, 0), c(nl, nl ,NA)), right=NA)
z <- cover(s, j)
f <- function(x) {
    i <- sum(is.na(x))
    if (i > 0 & i < 5) {
        x[is.na(x)] <- 0
    }
    x
}

zz <- calc(s, f)