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 ==
.
%in%
, aber Sie können dortgrepl("T[oi]m|lynne?", name)
jedes gewünschte Muster verwenden.Dies kann mit dem in CRAN verfügbaren dplyr-Paket erreicht werden. Der einfache Weg, dies zu erreichen:
dplyr
Paket installieren .library(dplyr) df<- select(filter(dat,name=='tom'| name=='Lynn'), c('days','name))
Erläuterung:
Sobald wir dplyr heruntergeladen haben, erstellen wir einen neuen Datenrahmen mit zwei verschiedenen Funktionen aus diesem Paket:
Filter: Das erste Argument ist der Datenrahmen. Das zweite Argument ist die Bedingung, unter der wir wollen, dass es untergeordnet wird. Das Ergebnis ist der gesamte Datenrahmen mit nur den gewünschten Zeilen. Wählen Sie: Das erste Argument ist der Datenrahmen. Das zweite Argument sind die Namen der Spalten, aus denen wir auswählen möchten. Wir müssen nicht die Funktion names () verwenden und wir müssen nicht einmal Anführungszeichen verwenden. Wir listen die Spaltennamen einfach als Objekte auf.
quelle
Verwenden des
base
Pakets:df <- data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn")) # Three lines target <- c("Tom", "Lynn") index <- df$name %in% target df[index, ] # One line df[df$name %in% c("Tom", "Lynn"), ]
Ausgabe:
days name 1 88 Lynn 2 11 Tom 6 1 Tom 7 222 Lynn 8 2 Lynn
Verwenden von
sqldf
:library(sqldf) # Two alternatives: sqldf('SELECT * FROM df WHERE name = "Tom" OR name = "Lynn"') sqldf('SELECT * FROM df WHERE name IN ("Tom", "Lynn")')
quelle
by_type_year_tag_filtered <- by_type_year_tag %>% dplyr:: filter(tag_name %in% c("dplyr", "ggplot2"))
quelle