È necessario %in%
invece di ==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
Produce
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
Per capire perché, consideriamo cosa succede qui:
dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
In sostanza, stiamo riciclando i due lunghezza target
vettore quattro volte in base alla lunghezza del dat$name
. In altre parole, stiamo facendo:
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
In questo caso non si ottiene un errore perché ho il sospetto che la cornice di dati ha in realtà un diverso numero di righe che non permettono il riciclo, ma il campione vi forniamo fa (8 righe). Se il campione avesse avuto un numero dispari di righe, avrei ricevuto lo stesso errore di te. Ma anche quando il riciclaggio funziona, questo non è chiaramente quello che vuoi. Fondamentalmente, l'istruzione dat$name == target
equivale a dire:
return TRUE
for every odd value that is equal to "Tom" or every even value that is equal to "Lynn".
Accade così che l'ultimo valore nel frame di dati campione è uniforme e uguale a "Lynn", quindi quello TRUE
sopra.
Per contrastare, dat$name %in% target
dice:
for each value in dat$name
, check that it exists in target
.
Molto diverso. Ecco il risultato:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
Nota il problema non ha nulla a che fare con dplyr
, solo il mis-uso di ==
.
Grazie per la spiegazione Brodie! Apprezzo davvero questo, clinico che cerca di capire R! –