Y a-t-il une courte négation de %in%
Dans R comme !%in%
Ou %!in%
?
Bien sûr, je peux annuler c("A", "B") %in% c("B", "C")
par !(c("A", "B") %in% c("B", "C"))
(cf. cette question ) mais je préférerais une approche plus simple et enregistrer une paire de crochets (de même la plupart des gens préfèreraient vraisemblablement c("A", "B") != c("B", "C")
plutôt que !(c("A", "B") == c("B", "C"))
).
Non, il n'y a pas de fonction intégrée pour le faire, mais vous pouvez facilement le coder vous-même avec
`%nin%` = Negate(`%in%`)
Ou
`%!in%` = Negate(`%in%`)
Voir ce fil et discussion de suivi: % in% operator - NOT IN
Il a également été souligné que le package Hmisc
inclut l'opérateur %nin%
, donc si vous l'utilisez pour vos applications, il est déjà là.
library(Hmisc)
"A" %nin% "B"
#[1] TRUE
"A" %nin% "A"
#FALSE
Vous pouvez toujours en créer un:
> `%out%` <- function(a,b) ! a %in% b
> 1:10 %out% 5:15
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
Sinon, il existe une fonction quelque peu similaire avec setdiff
, qui renvoie les éléments nique de a
qui ne sont pas dans b
:
> setdiff(1:10,5:15)
[1] 1 2 3 4
> setdiff(5:15,1:10)
[1] 11 12 13 14 15
En fait, vous n'avez pas besoin des parenthèses supplémentaires, !c("A", "B") %in% c("B", "C")
fonctionne.
Si vous préférez quelque chose qui se lit plus facilement, définissez-le vous-même:
"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L
Cela a l'avantage de ne pas gaspiller l'effort - nous n'obtenons pas de résultat, puis nous l'annulons, nous obtenons simplement le résultat directement. (la différence doit généralement être insignifiante)
La fonction %!in%
Est désormais disponible dans la fonction library(operators)