R中%in%的否定

59

在R中是否有类似于!%in%%!in%的简短否定形式来否定%in%


当然,我可以通过!(c("A", "B") %in% c("B", "C"))(参见这个问题)来否定c("A", "B") %in% c("B", "C"),但我更喜欢一种更直接的方法并且省略一对括号(就像大多数人可能更喜欢c("A", "B") != c("B", "C")而不是!(c("A", "B") == c("B", "C")))。


@SpencerCastro,我在问题中包含了一个链接。我的问题不同:我知道如何否定%in%的技术可能性。我的问题是关于是否有一种直接的方法。用户“catastrophic-failure”给出的答案是“没有,但是...”,这正是我想知道的。 - Qaswed
很好,我认为将这些问题链接在一起是有帮助的,因为两个问题都提供了解决方案的完整说明。 - Spencer Castro
4个回答

98

不,没有内置的函数可以做到这一点,但您可以轻松地使用代码自己编写实现。

`%nin%` = Negate(`%in%`)

或者

`%!in%` = Negate(`%in%`)

请参阅此讨论和跟进讨论:%in%运算符 - NOT IN(或者这里


此外,还指出包Hmisc 包含了操作符%nin%,所以如果您在应用程序中使用它,它已经存在。

library(Hmisc)
"A" %nin% "B"
#[1] TRUE
"A" %nin% "A"
#FALSE

2
好奇为什么这个函数存在,因为它所做的就是在其参数前面加上一个 ! - MichaelChirico
1
!以及括号。这是一个时间节省器。1个键 < 3个键加上箭头来创建括号。 - Canovice

11

您可以随时创建一个:

> `%out%` <- function(a,b) ! a %in% b

> 1:10 %out% 5:15
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
否则,可以使用 setdiff 函数,它返回在 b 中不存在的 a唯一元素

否则,可以使用setdiff函数,它返回a中不在b中出现的唯一元素

> setdiff(1:10,5:15)
[1] 1 2 3 4
> setdiff(5:15,1:10)
[1] 11 12 13 14 15

4
使用setdiff而不是否定的%in%时,你(或者说OP)应该小心,因为正如其名称所示,它是一个“集合”操作,因此仅返回“a”中不在“b”中的“唯一”元素。这可能与否定的%in%产生非常不同的结果。 - talat
没错,我会编辑一下以使这个观点更清晰。谢谢! - plannapus

8
实际上,您不需要额外的括号,!c("A", "B") %in% c("B", "C") 就可以工作。
如果您更喜欢一些易读的内容,只需自己定义即可:
"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L

这样做的优点是不会浪费精力-我们不会得到一个结果然后否定它,我们直接得到了结果。(通常情况下,差别应该微不足道)。

4

现在可以在 library(operators) 中使用 %!in% 函数。


2
我刚刚尝试使用operators包。这个包似乎会导致dplyr::group_by()出现问题。我没有进行调试,但是一旦我删除了库调用,问题就消失了。 - BBlank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接