R:Can';t用矢量中的零替换NAs

R:Can';t用矢量中的零替换NAs,r,raster,na,R,Raster,Na,我知道这个话题在过去出现过很多次,因为它在谷歌搜索中被多次找到。但不知何故,我不能用零替换向量中的NAs,而是所有值都被覆盖 我想做一些如下指南。当我进入必须使用setValues()函数的步骤时,我发现两个输入之间的长度不同。我认为原因是一些NA值,所以我检查了是否存在NAs,如果为真,则用零覆盖它们 要检查我做了什么: sum(is.infinite(nr)) sum(is.na(nr)) sum(is.nan(nr)) 从那以后,我知道有一些NAs。所以我就这么跟着。键入后: nr_2

我知道这个话题在过去出现过很多次,因为它在谷歌搜索中被多次找到。但不知何故,我不能用零替换向量中的NAs,而是所有值都被覆盖

我想做一些如下指南。当我进入必须使用setValues()函数的步骤时,我发现两个输入之间的长度不同。我认为原因是一些NA值,所以我检查了是否存在NAs,如果为真,则用零覆盖它们

要检查我做了什么:

sum(is.infinite(nr))
sum(is.na(nr))
sum(is.nan(nr))
从那以后,我知道有一些NAs。所以我就这么跟着。键入后:

nr_2 <- nr[!is.finite(nr)] <- 0

nr_2看起来好像
nr
被赋值为0,然后
nr_2
被赋值为
nr

您是否期待下面提供的结果?如果是这样的话,试着把代码分成两个独立的任务。这里我使用一个数字向量:


nr我没有足够的声誉来评论,但是@Corbjn你能详细解释一下nr的构成吗?打印str(nr)就足够了。正如@Eric所阐述的那样

small_vec<-c(NA,1,NA,1)
small_vec[is.na(small_vec)]<-0
#> num [1:4] 0 1 0 1

small_-vecJosh和Eric都正确地指出,问题在于nr_2的赋值,而不是nr的零赋值。但我想指出的是,如果有助于理解的话,您也可以使用
ifelse()
函数来实现这一点。像这样:

nr <- c(0, 4, 21, 10, 68, NA, NaN, Inf, -Inf, 10, 20, NA, NA, 9, 10)
nr_2 <- ifelse(is.finite(nr), nr, 0)
nr_2

# [1]  0  4 21 10 68  0  0  0  0 10 20  0  0  9 10


nr假设您正在处理光栅对象,可能是光栅层

library(raster)
r  <- raster(nrow=10, ncol=10, values=1:100)
r[1:10] = NA
库(光栅)

r是的,这就是所有内容都被零覆盖的步骤。试着使用两行代码和单独的赋值,如我的示例中所示。在带有两个赋值的单行代码中进行的排序导致结果为0.Yes。我预计结果会是这样。但是当我做
nr[!is.finite(nr)]时,可能是因为您的光栅太大了。也许可以帮助提供一个解决方案?
d=reclassify(r,cbind(NA,NA,0),right=FALSE)
其中
r
是光栅执行的。谢谢你的帮助!str(nr)获取:
num[1:120560400]0.357 0.379 0.376 0.372 0.413…
nr是作为数字的光栅对象。您可以使用getValues()获得它。您可以使用
dput(head(nr))
添加部分数据,以便我们知道正在处理的数据类型吗?问题是向量的大小。
nr <- c(0, 4, 21, 10, 68, NA, NaN, Inf, -Inf, 10, 20, NA, NA, 9, 10)
nr_2 <- ifelse(is.finite(nr), nr, 0)
nr_2

# [1]  0  4 21 10 68  0  0  0  0 10 20  0  0  9 10

library(raster)
r  <- raster(nrow=10, ncol=10, values=1:100)
r[1:10] = NA
d <- reclassify(r, cbind(NA, 0))
r[is.na(r)] <- 0
r[!is.finite(r)] <- 0