Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Negation of %in% in R [duplicate]

Tags:

r

match

negation

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"))).

like image 672
Qaswed Avatar asked Jul 13 '16 12:07

Qaswed


People also ask

Whats the opposite of in in R?

R operator %in% is handy for working with vectors, but how to use it oppositely? Something like %notin% that will exclude anything that is in a vector. There is no actual %notin% operator in R, but below is the explanation on how to get the desired result.

How do I avoid duplicates in R?

Remove duplicate rows in a data frameThe function distinct() [dplyr package] can be used to keep only unique/distinct rows from a data frame. If there are duplicate rows, only the first row is preserved. It's an efficient version of the R base function unique() .

How do I remove duplicate characters in R?

To remove duplicates in R, Use duplicated() method: It identifies the duplicate elements. Using unique() method: It extracts unique elements. dplyr package's distinct() function: Removing duplicate rows from a data frame.


Video Answer


3 Answers

No, there isn't a built in function to do that, but you could easily code it yourself with

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

Or

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

See this thread and followup discussion: %in% operator - NOT IN (alternatively here)


Also, it was pointed out the package Hmisc includes the operator %nin%, so if you're using it for your applications it's already there.

library(Hmisc)
"A" %nin% "B"
#[1] TRUE
"A" %nin% "A"
#FALSE
like image 112
catastrophic-failure Avatar answered Oct 10 '22 09:10

catastrophic-failure


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)

like image 8
MichaelChirico Avatar answered Oct 10 '22 08:10

MichaelChirico


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
like image 10
plannapus Avatar answered Oct 10 '22 09:10

plannapus