R:Can';t用矢量中的零替换NAs
我知道这个话题在过去出现过很多次,因为它在谷歌搜索中被多次找到。但不知何故,我不能用零替换向量中的NAs,而是所有值都被覆盖 我想做一些如下指南。当我进入必须使用setValues()函数的步骤时,我发现两个输入之间的长度不同。我认为原因是一些NA值,所以我检查了是否存在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
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