使用非运算符 `!` 进行子集化

subsetting with not operator `!`

在回答这个问题 .

时,我只是 运行 发现子集化中 not ! 运算符的一个有趣的细微差别

查看:

y <- 1:10
y[!y]
integer(0)
y[4] <- NA
y[!y]
[1] NA
y[6] <- 0
y[!y]
[1] NA  0

来自 R 文档:

! indicates logical negation (NOT)

为什么 0 和 NA 都不是 y?

您没有使用等式进行子集化,而是将数字 1:10 强制转换为逻辑值——任何非 0 的数字都被转换为 TRUE。 运行,例如,

!(1:10)
#  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

你得到 10 FALSEs,所以当你将长度为 10 的 any 向量子集化为 10 FALSEs 时,你什么也得不到。

?TRUE?NA 中所述,与 NA 的逻辑比较结果为 NA

当然,0 被强制转换为 FALSE,因此 !0 被强制转换为 TRUE,因此当您将第 6 个元素设置为 0 时,

 !c(1:5, 0, 7:10)
 # [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 #         1     2     3     4     5  ^^^6     7     8     9    10

您在第 6 个位置得到一个 TRUE,因此用它进行子集化将 return 第 6 个元素。

How is 0 and NA both NOT y?

您可能正在寻找 y[y != y]?

0 在逻辑运算(布尔代数)中被解释为 FALSE。 !0 = !(假) = 真。

同样,非 0 有效(即非 NA)数值在逻辑运算中被解释为 TRUE。

NA 总是很棘手,请参阅上面 Frank 的评论。