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 中看到它。不同寻常的是,它没有返回逻辑 TRUE
或 FALSE
,而是 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
当我从头开始制作栅格并使用 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 中看到它。不同寻常的是,它没有返回逻辑 TRUE
或 FALSE
,而是 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