此问题可能与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
替换。
答案 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
遇到1
和NA
时返回NA
。 R中的NA
基本上是在说:
&#34;我不知道这个价值是多少。它可以是
1
或任何其他 数字,因此我不会排除它,但都没有说出它是什么&#34;
所以当你这样做时
xmpl[xmpl == 1]
## [1] 1 NA 1 NA NA 1 1 1
R选择TRUE
中的所有NA
和xmpl == 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%更合适。