问题描述
我知道该主题在过去出现过很多次,因为通过Google搜索多次被发现。但是以某种方式,我不能用零代替向量中的NA,相反所有值都会被覆盖。
我想按照this指南进行一些kmeans聚类。当我进入必须使用setValues()函数的步骤时,我意识到两个输入之间的长度是不同的。我以为原因是一些NA值,所以我检查是否有NA,如果为true,则用零覆盖它们。
要检查我是否这样做:
sum(is.infinite(nr))
sum(is.na(nr))
sum(is.nan(nr))
那之后,我知道有一些NA。因此,我遵循了this。输入后:
nr_2 <- nr[!is.finite(nr)] <- 0
所有值都被零覆盖。因此,我检查了nr
的数据类型。 RStudio声明为“大数字”,并在键入is.vector(nr)
后返回TRUE
。索引编制有问题吗?因此,我尝试使用nr[1]
提取单个值,并且得到了我期望的结果。但是我也尝试了nr[[1]]
,它也起作用并且返回了相同的值。到那时,一些解释会很棒。
但是主要的问题是,为什么我不能用零代替NA。
解决方法
似乎nr
被分配了0的值,然后nr_2
被分配了nr
的值。
您是否期望得到如下所示的结果?如果是这样,请尝试将您的代码分成两个单独的分配。在这里,我使用的是数值向量:
nr <- c(0,4,21,10,68,NA,NaN,Inf,-Inf,20,9,10)
nr[!is.finite(nr)] <- 0
nr_2 <- nr
nr_2
#> [1] 0 4 21 10 68 0 0 0 0 10 20 0 0 9 10
由reprex package(v0.3.0)于2020-08-16创建
自从您指出这是一个相当大的raster
对象:
str(nr) I get: num [1:120560400] 0.357 0.379 0.376 0.372 0.413 ...
考虑使用以下内容:
nr_2 = reclassify(nr,cbind(NA,0),right=FALSE)
并参考this以获得更多信息。
,我没有足够的声誉来发表评论,但是@Corbjn您能否确切说明nr的构成?打印str(nr)可能就足够了。正如@Eric阐述的那样
module.exports = ({ env }) => ({
defaultConnection: 'default',connections: {
default: {
connector: 'bookshelf',settings: {
"client":"postgres","host":"${process.env.DATABASE_HOST}","port": "${process.env.DATABASE_PORT}","database": "${process.env.DATABASE_NAME}","username": "${process.env.DATABASE_USERNAME}","password": "${process.env.DATABASE_PASSWORD}","ssl": { "rejectUnauthorized": false }
},options: {
},},});
her
演示了数字矢量https://stat.ethz.ch/R-manual/R-devel/library/base/html/numeric.html所需操作的代表。
, Josh和Eric都正确指出问题在于分配给nr_2,而不是分配零给nr。但我想提一下,您也可以使用ifelse()
函数来执行此操作,如果这样做可以帮助您更加理解它。像这样:
nr <- c(0,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
,
鉴于您正在处理一个栅格对象,大概是一个RasterLayer
library(raster)
r <- raster(nrow=10,ncol=10,values=1:100)
r[1:10] = NA
现在您可以(我的喜好)
d <- reclassify(r,0))
或以下方法(用于在较小的对象上进行快速交互操作)
r[is.na(r)] <- 0
或
r[!is.finite(r)] <- 0