R中%的百分比否定

Qas*_*wed 21 r match negation

%in%R中是否存在短暂否定!%in%%!in%


当然,我可以否定c("A", "B") %in% c("B", "C")通过!(c("A", "B") %in% c("B", "C"))(见这个问题),但我会prefere一个更直接的方法,节省了一个括号(都想必大多数人宁愿c("A", "B") != c("B", "C")!(c("A", "B") == c("B", "C"))).

cat*_*ure 38

不,没有内置功能可以做到这一点,但您可以轻松自己编写代码

`%nin%` = Negate(`%in%`)
Run Code Online (Sandbox Code Playgroud)

要么

`%!in%` = Negate(`%in%`)
Run Code Online (Sandbox Code Playgroud)

请参阅此主题和后续讨论:%in%operator - NOT IN


此外,有人指出该软件包Hmisc包括操作员%nin%,因此如果您将它用于您的应用程序,它已经存在.

library(Hmisc)
"A" %nin% "B"
#[1] TRUE
"A" %nin% "A"
#FALSE
Run Code Online (Sandbox Code Playgroud)

  • 好奇为什么这个函数存在,因为它所做的只是在它的参数前面抛出一个“!” (2认同)

pla*_*pus 6

你总是可以创建一个:

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

> 1:10 %out% 5:15
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

否则有一个类似的函数setdiff,它返回不在的唯一元素:ab

> setdiff(1:10,5:15)
[1] 1 2 3 4
> setdiff(5:15,1:10)
[1] 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)

  • 你(或者更确切地说,OP)应该小心使用`setdiff`而不是否定'%in%`,因为,正如名称所示,它是一个_set_操作,因此只返回`a`的_unique_元素在`b`.这可能与否定的'%in%`有很大不同. (3认同)

Mic*_*ico 5

实际上,您不需要多余的括号即可!c("A", "B") %in% c("B", "C")

如果您喜欢更容易阅读的内容,请自己定义:

"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L
Run Code Online (Sandbox Code Playgroud)

这具有不浪费精力的优势-我们没有得到结果,然后取反,我们只是直接得到结果。(差异通常不大)