【问题标题】:Matrix subset includes NA矩阵子集包括 NA
【发布时间】:2014-12-17 19:50:56
【问题描述】:

这个问题可能与this question 有关。我不明白为什么使用[ 对矩阵进行子集化时返回的向量包含NA 值。

set.seed(1234)
xmpl <- matrix(sample(c(1:4, NA_real_), 25, replace = TRUE), 5, 5)
# > xmpl
#       [,1] [,2] [,3] [,4] [,5]
# [1,]    1    4    4   NA    2
# [2,]    4    1    3    2    2
# [3,]    4    2    2    2    1
# [4,]    4    4   NA    1    1
# [5,]   NA    3    2    2    2

# > xmpl[xmpl == 1]
# [1]  1 NA  1 NA NA  1  1  1

替换工作如我所料:

xmpl[xmpl == 1] <- 10
# > xmpl
#       [,1] [,2] [,3] [,4] [,5]
# [1,]   10    4    4   NA    2
# [2,]    4   10    3    2    2
# [3,]    4    2    2    2   10
# [4,]    4    4   NA   10   10
# [5,]   NA    3    2    2    2

从矩阵中提取向量时,我应该使用%in% 而不是== 吗?为什么分配/替换行为与子集行为不同 - 即。当xmpl[xmpl == 1] &lt;- 10 调用时,为什么NA​​ 值不会被10 替换。

【问题讨论】:

  • 在这里用肢体出去,行为是不同的,因为提取取决于[,而提取/替换取决于[&lt;-
  • 虽然有些人会抱怨按键次数加倍,但%in% 在大多数情况下可以替代(并且比使用更好)==xmpl[xmpl %in% 1]; xmpl[xmpl %in% c(1, NA)]

标签: r matrix subset


【解决方案1】:

参见?"["索引中的 NAs

“当提取 [即[]时,数字、逻辑或字符NA索引会选择一个未知元素,因此返回NA 在逻辑、整数、数字、复数或字符结果的相应元素中"

“当替换 [即[&lt;-](即在分配的lhs上使用索引)NA不选择任何要替换的元素

【讨论】:

  • 应该是?'[',(特殊字符需要引号)。
【解决方案2】:

R 中的matrix 只是一个具有dim 属性的向量(参见?matrix)。

dim(xmpl)
## [1] 5 5
attributes(xmpl)
##$dim
##[1] 5 5

因此,如果你这样做了

dim(xmpl) <- NULL

xmpl 会变成一个向量

xmpl
# [1]  1  4  4  4 NA  4  1  2  4  3  4  3  2 NA  2 NA  2  2  1  2  2  2  1  1  2

现在,如果你仔细看看这个向量,你就会明白

的结果
xmpl == 1
## [1]  TRUE FALSE FALSE FALSE    NA FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE    NA FALSE    NA FALSE FALSE  TRUE
## [20] FALSE FALSE FALSE  TRUE  TRUE FALSE

==只是扫描整个向量,遇到1时返回TRUE,遇到NA时返回NA。 R 中的NA 基本上是在说:

“我不知道这个值是什么。它可能是1 或任何其他 编号,所以我不会排除它,但也不说它是什么”

所以当你这样做时

xmpl[xmpl == 1]
## [1]  1 NA  1 NA NA  1  1  1

R 从xmpl == 1 中选择所有TRUENA按照它们的出现顺序同时忽略所有FALSE 值,即你有一个TRUE,然后是@987654342 @,然后是另一个TRUE,然后是另外两个NAs,等等。

对于[&lt;-,请参阅@Henriks 答案

【讨论】:

  • (+1) 感谢您的补充说明。
【解决方案3】:

我实际上认为这种行为是预期的,因为

xmpl[xmpl == 1]

将生成一个 TRUE/FALSE 向量,用于从矩阵中选择元素。现在,由于比较 NA == 1 既不能生成 TRUE 也不能生成 FALSE(根据定义它是 NA),因此最好的选择是返回 NA 而不是假设它是。可以这样想:矩阵的位置 NA 处的值是多少?好吧,由于不存在 NA 位置,因此返回的唯一合理值是 NA。

现在关于分配

xmpl[xmpl == 1] <- 10

在这种情况下,再次生成一个具有 TRUE 或 FALSE 和 NA 的向量。现在是 INDEX 是 NA 而不是值 NA 将被替换。那么如何替换 POSITION NA 的值呢?好吧,你不能,因为这将是无稽之谈。这就是为什么只有 TRUE 案例被 10 替换的原因。

这也是我所期望的。所以回答你的问题:是的,在这种情况下 %in% 会更合适。

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2020-10-01
    • 2014-02-02
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多