在回答此问题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都不是吗?
答案 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的上述评论。