【问题标题】:subsetting with not operator `!`使用非运算符 `!` 进行子集化
【发布时间】:2015-05-19 16:00:24
【问题描述】:

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

退房:

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

来自 R 文档:

!表示逻辑 否定(NOT)

0 和 NA 怎么都不是 y?

【问题讨论】:

标签: r operators subset


【解决方案1】:

您没有使用相等性进行子集化,而是将数字 1:10 强制为逻辑 - 并且 0 以外的任何数字都被强制为 TRUE。运行,例如,

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

你得到 10 个 FALSEs,所以当你用 10 个 FALSEs 子集一个长度为 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

TRUE 在第 6 个位置,因此子集将返回第 6 个元素。

0 和 NA 怎么都不是 y?

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

【讨论】:

  • 哦,对了。也许OP的意思是-y而不是!y
  • @Frank 也许。我认为 OP 的意思是y[y != y],否则一半的混淆是由于使用y 作为子集的向量和索引,无论是-y 还是!y
  • @Frank 我的意思是按照我的方式对其进行子集化。 akrun 使用了 Gregor 在我链接到的问题中提到的逻辑替换。这很聪明。只是想了解其中的逻辑。
  • @plafort 哦,我错过了上面的链接,因为我阅读能力很差;感谢您的澄清 :) 就个人而言,我会链接“这个问题”而不是附加“链接”或“点击此处”以使其更加突出。顺便说一句,一个可能非常重要的区别:您的问题实际上与@akrun 的评论不同。您正在询问子集器`[`,而他正在使用分配器`[&lt;-`
  • @plafort 是的,引用 Gregor:“除 0 [和 NA] 以外的任何数字都被强制为 TRUE”
【解决方案2】:

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

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

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

【讨论】:

  • 关于第二行:is.numeric(NA_integer_); !(NA_integer_) 是一个反例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多