【问题标题】:R: Can't replace NAs with zeros in vectorR:不能用向量中的零替换 NA
【发布时间】:2020-12-05 23:57:36
【问题描述】:

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

我想按照this 指南做一些kmeans 聚类。当我进入必须使用 setValues() 函数的步骤时,我意识到两个输入之间的长度不同。我认为原因是一些 NA 值,所以我检查了是否有 NA,如果为真,则用零覆盖它们。

检查我做了:

sum(is.infinite(nr))
sum(is.na(nr))
sum(is.nan(nr))

在那之后,我知道有一些 NA。所以我关注了this SO。输入后:

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

所有值都被零覆盖。所以我检查了nr的数据类型。 RStudio 声明“大数字”并在输入is.vector(nr) 后返回TRUE。我的索引有什么问题吗?所以我尝试使用nr[1] 提取单个值,我得到了我的预期。但我也尝试了nr[[1]],它也有效并返回了相同的值。到那时,一些解释会很棒。

但主要问题仍然存在,为什么我不能用零替换 NA。

【问题讨论】:

  • 您能否使用dput(head(nr)) 添加您的部分数据,以便我们知道我们正在处理什么样的数据?

标签: r raster na


【解决方案1】:

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

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

nr <- c(0, 4, 21, 10, 68, NA, NaN, Inf, -Inf, 10, 20, NA, NA, 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, NA, 0), right=FALSE)

并参考this 了解更多信息。

【讨论】:

  • 是的,这就是所有内容都被零覆盖的步骤。
  • 尝试使用两行代码进行单独的分配,就像我的例子一样。在您的单行代码中进行的具有两个分配的排序导致其结果为 0。
  • 是的。我希望这是结果。但是当我执行nr[!is.finite(nr)] &lt;- 0 时,向量中的所有内容都会被零覆盖。无论我是在一行中执行您的两行还是我的版本。 nr 是您使用 getValues() 获得的栅格对象的数字版本。如果我这样做str(nr),我会得到:num [1:120560400] 0.357 0.379 0.376 0.372 0.413 ...
  • 可能是您的栅格太大。也许this 可以帮助提供解决方案?
  • d = reclassify(r, cbind(NA, NA, 0), right=FALSE) 其中r 是光栅。感谢您的帮助!
【解决方案2】:

我没有足够的声誉来发表评论,但是@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

演示数字向量 https://stat.ethz.ch/R-manual/R-devel/library/base/html/numeric.html 所需操作的表示。

【讨论】:

  • str(nr) 得到:num [1:120560400] 0.357 0.379 0.376 0.372 0.413 ... nr 是数字形式的栅格对象。你可以通过 getValues() 得到它。
【解决方案3】:

Josh 和 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

【讨论】:

  • 问题在于向量的大小。
【解决方案4】:

假设您正在处理一个光栅对象,大概是一个 RasterLayer

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

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多