R:无法将向量中的NA替换为零

问题描述

我知道该主题在过去出现过很多次,因为通过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