Sie benötigen %in%
anstelle von ==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target)
Produziert
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
Um zu verstehen, warum, überlegen Sie, was hier passiert:
dat$name == target
Grundsätzlich recyceln wir den target
Vektor mit zwei Längen viermal, um ihn an die Länge von anzupassen dat$name
. Mit anderen Worten, wir machen:
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
In diesem Fall wird kein Fehler angezeigt, da ich vermute, dass Ihr Datenrahmen tatsächlich eine andere Anzahl von Zeilen enthält, die kein Recycling zulassen, die von Ihnen bereitgestellte Stichprobe jedoch (8 Zeilen). Wenn die Stichprobe eine ungerade Anzahl von Zeilen gehabt hätte, hätte ich den gleichen Fehler wie Sie erhalten. Aber selbst wenn das Recycling funktioniert, ist dies eindeutig nicht das, was Sie wollen. Grundsätzlich ist die Aussage dat$name == target
gleichbedeutend mit:
Rückgabe TRUE
für jeden ungeraden Wert, der gleich "Tom" ist, oder für jeden geraden Wert, der gleich "Lynn" ist.
Es kommt also vor, dass der letzte Wert in Ihrem Beispieldatenrahmen gerade und gleich "Lynn" ist, daher der TRUE
obige.
Im Gegensatz dazu dat$name %in% target
sagt:
dat$name
Überprüfen Sie für jeden Wert in , ob er in vorhanden ist target
.
Sehr verschieden. Hier ist das Ergebnis:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
Beachten Sie, dass Ihr Problem nichts mit dplyr
dem Missbrauch von zu tun hat ==
.