R:即使添加了值,栅格也会出现 NA

R: raster comes up with NAs even though values were added

当我从头开始制作栅格并使用 length(is.na(raster)) 时,我得到的所有像元都是 NA,但是如果我输入代码 raster[],我会收到像元值。

我在制作光栅的时候用过...vals=0设置一个全0的光栅 我也试过 raster[]<-0 这使我所有的值都为 0 但仍然显示 25 个 NA。

library(raster)

size<-5
resol<-5
popseq<-seq(1,100,1)
stage1<-raster(nrow=size,ncol=size,xmn=0,xmx=(size*resol),ymn=0,ymx=(size*resol),resolution=resol,vals=0)
stage1[]<-sample(popseq,size*size, replace=T)
length(is.na(stage1))
#> [1] 25
stage1[1:(size*size)]
#> [1]  48  24  33   6 100  18  31  10  40  55  15  56  27  24  16  78  93  14  95  86  87  56  90  53  55
length(is.na(stage1))
#> [1] 25

这不仅是一个有趣的问题,而且我相信它还会导致我的 "non-conformable arguments"-下游错误(我正在研究 post 关于那段代码的 atm,它是更多参与)。

可能 遗漏了一些令人沮丧的显而易见的东西。

首先,length(is.na(stage1))不会给你NA的数量。它会给你返回向量的长度(例如 length(is.na(c(NaN,5,6,NaN))) 等于 4)。 sum(is.na(stage1)) 在这里更合适,但实际上调用整个栅格对象时并没有调用这些值。这将是做你想做的事情的方法:

sum(is.na(getValues(stage1)))
# [1] 0

这个回答有点复杂,还请多多包涵

首先思考如下代码:

x <- c(1, 2, 3, 4, 5)

您希望从下一行得到什么结果?

length(is.na(x))

如果您认为答案应该为零,那是错误的。答案是5。看:

is.na(x)
#> [1] FALSE FALSE FALSE FALSE FALSE

is.na(x)给出了一个与x长度相同的逻辑向量。所以 is.na(x)length 是 5。如果你想要给出零长度的函数,它应该是:

length(which(is.na(x)))
#> [1] 0

但是,这并不是您的代码无法按预期工作的唯一原因。原因是 is.na 是一个泛型函数。这意味着创建新 class 对象(例如您正在使用的包中的 Raster )的包开发人员可以编写他们自己的 is.na 版本来处理该 class 适当地。

Raster 的情况下,包的作者确实定义了他们自己的 is.na 版本。您可以在包的源代码 here 中看到它。不同寻常的是,它没有返回逻辑 TRUEFALSE,而是 returns 具有相同维度的原始 Raster,但其所有值都设置为零。看:

is.na(stage1)
#> class      : RasterLayer 
#> dimensions : 5, 5, 25  (nrow, ncol, ncell)
#> resolution : 5, 5  (x, y)
#> extent     : 0, 25, 0, 25  (xmin, xmax, ymin, ymax)
#> crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#> source     : memory
#> names      : layer 
#> values     : 0, 0  (min, max)

现在,碰巧 Raster 的作者也定义了一个通用的 length 方法,定义为 here。这意味着 is.na(stage1) 返回的对象的长度为 25。

所以如果你想证明你的栅格中没有 NA 值,你真正想要做的是替换

length(is.na(stage1))

length(which(is.na(stage1[1:(size*size)])))
#> [1] 0