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

时间:2015-05-19 16:00:25

标签: r operators subset

在回答此问题link时,我在子集化中遇到了一个非!运算符的有趣细微差别。

退房:

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

来自R文档:

  

!表示逻辑   否定(不)

0和NA都不是吗?

2 个答案:

答案 0 :(得分:1)

您没有使用相等性进行子集化,您正在将数字1:10强制转换为逻辑 - 并且除0之外的任何数字都会强制转换为TRUE。运行,例如,

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

你得到10 FALSE s,所以当你将长度为10的任何向量与10 FALSE个进行子集时,你什么也得不到。

正如?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,所以用它进行子集将返回第6个元素。

  

0和NA都不是吗?

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

答案 1 :(得分:0)

在逻辑运算(布尔代数)中,

0被解释为FALSE。   !0 =!(FALSE)= TRUE。

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

NAs总是很棘手,请参阅Frank的上述评论。