Question Différence entre `% in%` et `==`


df <- structure(list(x = 1:10, time = c(0.5, 0.5, 1, 2, 3, 0.5, 0.5, 
1, 2, 3)), .Names = c("x", "time"), row.names = c(NA, -10L), class = "data.frame")


df[df$time %in% c(0.5, 3), ]
##     x time
## 1   1  0.5
## 2   2  0.5
## 5   5  3.0
## 6   6  0.5
## 7   7  0.5
## 10 10  3.0

df[df$time == c(0.5, 3), ]
##     x time
## 1   1  0.5
## 7   7  0.5
## 10 10  3.0

Quelle est la différence entre %in% et == ici?


17
2018-03-12 09:54


origine


Réponses:


Le problème est le recyclage des vecteurs.

Votre première ligne fait exactement ce à quoi vous vous attendiez. Il vérifie quels éléments de df$time sont dans c(0.5, 3) et renvoie les valeurs qui sont.

Votre deuxième ligne est plus difficile. C'est en fait équivalent à

df[df$time == rep(c(0.5,3), length.out=nrow(df)),]

Pour voir cela, voyons ce qui se passe si on utilise un vecteur rep(0.5, 10):

rep(0.5, 10) == c(0.5, 3)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

Voir comment il retourne chaque valeur impaire. Essentiellement, il correspond à 0,5 au vecteur c(0.5, 3, 0.5, 3, 0.5...)

Vous pouvez manipuler un vecteur pour ne produire aucune correspondance de cette façon. Prenez le vecteur: rep(c(3, 0.5), 5):

rep(c(3, 0.5), 5) == c(0.5, 3)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Ils sont tous FAUX. Vous faites correspondre chaque 0,5 avec 3 et vice versa.


23
2018-03-12 10:01



Dans

df$time == c(0.5,3)

la c(0.5,3) d'abord diffusé à la forme de df$time, c'est à dire. c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3). Ensuite, les deux vecteurs sont comparés élément par élément.

D'autre part,

df$time %in% c(0.5,3)

vérifie si chaque élément de df$time appartient à l'ensemble {0.5, 3}.


9
2018-03-12 10:01