web-dev-qa-db-fra.com

Différence entre les opérateurs == et% en% dans R

Ma question concerne la différence pratique entre les opérateurs == et %in% dans R.

J'ai rencontré une situation au travail où le filtrage avec l'un ou l'autre des opérateurs donne des résultats différents (par exemple, un résultat sur 800 lignes et l'autre 1200). J'ai rencontré ce problème par le passé et je peux valider de manière à obtenir les résultats souhaités. Cependant, je suis toujours perplexe quant à la différence.

Quelqu'un peut-il s'il vous plaît nous éclairer sur la différence entre ces opérateurs? 

3
R_user1233

%in% est value matching and "et retourne un vecteur des positions de (premier) correspond à son premier argument dans son deuxième" (Voir help('%in%')) Cela signifie que vous pouvez comparer des vecteurs de différentes longueurs pour voir si les éléments d'un vecteur correspondent au moins un élément dans un autre. La longueur de sortie sera égale à la longueur du vecteur comparé (le premier).

1:2 %in% rep(1:2,5)
#[1] TRUE TRUE

rep(1:2,5) %in% 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

#Note this output is longer in second

== est opérateur logique destiné à comparer si deux choses sont exactement égales. Si les vecteurs ont la même longueur, les éléments seront comparés élément par élément. Sinon, les vecteurs seront recyclés. La longueur de la sortie sera égale à la longueur du vecteur le plus long.

1:2 == rep(1:2,5)
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

rep(1:2,5) == 1:2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

1:10 %in% 3:7
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

#is same as 

sapply(1:10, function(a) any(a == 3:7))
#[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

REMARQUE: Si possible, essayez d'utiliser identical ou all.equal au lieu de == et.

10
d.b

Essayez-le pour des objets de différentes longueurs.

ac <- c("a", "b", "c")
ae <- c("a", "b", "c", "d", "e")
ac %in% ae
[1] TRUE TRUE TRUE
ac == ae
[1]  TRUE  TRUE  TRUE FALSE FALSE

Il devient clair que %in% vérifie si l'objet est contenu ou non dans l'autre objet. Alors que == est un opérateur logique qui vérifie les propriétés d'identité.

3
jchaykow

Étant donné deux vecteurs, x et y, le code x == y comparera le premier élément de x avec le premier élément de y, puis le deuxième élément de x avec le deuxième élément de y, et ainsi de suite. Lorsque vous utilisez x == y, les longueurs de x et y doivent être identiques. Ici, compare signifie "est égal à" et la sortie est donc un vecteur logique égal à la longueur de x (ou y).

Dans le code x% dans% y , le premier élément de x est comparé à all éléments dans y, puis le deuxième élément de x est comparé à all éléments de y, et ainsi de suite. sur. Ici, le moyen de comparaison "est l’élément actuel de x égal à toute valeur de y" et la sortie est donc un vecteur logique qui a la même longueur de x et non (nécessairement) y. 

Voici un extrait de code illustrant la différence. Notez que x et y ont les mêmes longueurs mais les éléments de y sont les éléments de x dans un ordre différent. Notez également dans les derniers exemples que x est un vecteur à 3 éléments comparé au lettres vecteur, qui contient 26 éléments.

> x <- c('a','b','c')
> y <- c('c', 'b', 'a')
> x == y
[1] FALSE  TRUE FALSE

> x %in% y
[1] TRUE TRUE TRUE

> x %in% letters
[1] TRUE TRUE TRUE

> letters %in% x
 [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [7] FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE
1
Jaguar

== vérifie si les éléments d'un vecteur sont égaux à tous les éléments d'un autre vecteur. Idéalement, deux vecteurs auront la même taille (ou des résultats inattendus, car lorsque les tailles ne correspondent pas, R recycle le vecteur le plus court, en silence si les tailles sont des multiples les unes des autres). Par exemple

c(1,2,3) == c(1,3,2)
[1]  TRUE FALSE FALSE

ou

c(1,2) == c(1,3,2)
[1]  TRUE FALSE FALSE
Warning message:
In c(1, 2) == c(1, 3, 2) :
  longer object length is not a multiple of shorter object length

%in% vérifie par contre quels éléments de la liste 1 sont inclus dans la liste 2

c(1,2,3) %in% c(1,3,2)
[1]  TRUE TRUE TRUE

ou 

c(1,2) %in% c(1,3,2)
[1] TRUE TRUE
0
OganM