web-dev-qa-db-fra.com

Négation de% en% en R

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

21
Qaswed

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
37

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
6
plannapus

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)

5
MichaelChirico

La fonction %!in% Est désormais disponible dans la fonction library(operators)