问题
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"))
).
回答1:
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
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
回答2:
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
回答3:
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)
回答4:
The %!in%
function is now available in the library(operators)
来源:https://stackoverflow.com/questions/38351820/negation-of-in-in-r