'Negation of %in% in R [duplicate]

Is there a short negation of %in% in R like !%in% or %!in%?


Of course I can negate c("A", "B") %in% c("B", "C") by !(c("A", "B") %in% c("B", "C")) (cf. this question) but I would prefere a more straight forward approach and save a pair of brackets (alike presumably most people would prefer c("A", "B") != c("B", "C") over !(c("A", "B") == c("B", "C"))).



Solution 1:[1]

You can always create one:

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

> 1:10 %out% 5:15
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

Otherwise there is a somewhat similar function with setdiff, which returns the unique elements of a that are not in b:

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

Solution 2:[2]

Actually you don't need the extra parentheses, !c("A", "B") %in% c("B", "C") works.

If you prefer something that reads easier, just define it yourself:

"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L

This has the advantage of not wasting effort -- we don't get a result and then negate it, we just get the result directly. (the difference should generally be trivial)

Solution 3:[3]

The %!in% function is now available in the library(operators)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3