R 使用not运算符“”进行子集设置`
我刚刚在notR 使用not运算符“”进行子集设置`,r,operators,subset,R,Operators,Subset,我刚刚在not中遇到了一个有趣的细微差别运算符 退房: y <- 1:10 y[!y] integer(0) y[4] <- NA y[!y] [1] NA y[6] <- 0 y[!y] [1] NA 0 y您没有使用等分法进行子集设置,而是将数值1:10强制为逻辑值,而0以外的任何数值都强制为TRUE。运行,例如 !(1:10) # [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 得到1
中遇到了一个有趣的细微差别回答此问题时,在子集设置中使用代码>运算符
退房:
y <- 1:10
y[!y]
integer(0)
y[4] <- NA
y[!y]
[1] NA
y[6] <- 0
y[!y]
[1] NA 0
y您没有使用等分法进行子集设置,而是将数值1:10
强制为逻辑值,而0以外的任何数值都强制为TRUE
。运行,例如
!(1:10)
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
得到10FALSE
s,因此当你用10FALSE
s子集长度为10的any向量时,什么也得不到
如?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!=y]
?0在逻辑运算(布尔代数)中被解释为FALSE。
!0 = !(假)=真
同样,非0有效(即非NA)数值在逻辑运算中被解释为TRUE
NAs总是很棘手,请参见上面Frank的评论。我认为,任何在NA
上运行的操作都是NA
。我怀疑这是个骗局。这是我的data.table变体,如果你感兴趣的话:我想这是最好的问答。不确定你是否认为这是个骗局:不。。。检查此长度(NA);长度(真);y[NA];是的
哦,对了。也许OP的意思是-y
,而不是!可能是弗兰克。我认为OP的意思是y[y!=y]
,否则一半的混淆是由于使用y
作为向量和子集的索引,无论是使用-y
还是!y
@Frank我本想用我的方式将其细分。akrun使用了Gregor在我链接的问题中提到的逻辑替换。它很聪明。“我只是想理解其中的逻辑。”普拉福特:哦,我错过了上面的链接,因为我阅读能力很差;感谢您的澄清:)就我个人而言,我会将“这个问题”链接起来,而不是添加“链接”或“点击这里”,以使其更加突出。顺便说一句,一个可能非常重要的区别是:你的问题实际上与@akrun的评论无关。您询问的是子服务商`[`
,而他使用赋值人`[@plafort Yeah,引用Gregor的话:是。numeric(NA_integer);(NA_integer)
是一个反例。