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"))
).
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.
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() .
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.
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
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With