使用非运算符 `!` 进行子集化
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 FALSE
s,所以当你将长度为 10 的 any 向量子集化为 10 FALSE
s 时,你什么也得不到。
如 ?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 的评论。
在回答这个问题
!
运算符的一个有趣的细微差别
查看:
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 FALSE
s,所以当你将长度为 10 的 any 向量子集化为 10 FALSE
s 时,你什么也得不到。
如 ?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 的评论。