矩阵子集包括NA

时间:2014-12-17 19:50:56

标签: r matrix subset

此问题可能与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%而不是==吗?为什么赋值/替换行为与子集行为不同 - 即。当10调用时,为什么NA​​值不会被xmpl[xmpl == 1] <- 10替换。

3 个答案:

答案 0 :(得分:1)

请参阅?"["索引中的NAs

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

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

答案 1 :(得分:1)

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

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

  

&#34;我不知道这个价值是多少。它可以是1或任何其他   数字,因此我不会排除它,但都没有说出它是什么&#34;

所以当你这样做时

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

R选择TRUE 中的所有NAxmpl == 1值,其外观顺序为,同时忽略所有FALSE值,即您有一个TRUE,然后是NA,然后是另一个TRUE,然后是另外两个NA等。

[<-请参阅@Henriks答案

答案 2 :(得分:0)

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

xmpl[xmpl == 1]

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

现在关于作业

xmpl[xmpl == 1] <- 10
在这种情况下,

再次导致向量为TRUE或FALSE和NA。现在它是NA的INDEX而不是将被替换的NA值。那么如何替换POSITION NA的值呢?好吧,你不能,因为它是不存在的。这就是为什么只有真正的案例被10替换的原因。

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