Zeilen mit filter() filtern
Die Funktion filter() dient dazu, Zeilen zu filtern, also diejenigen zu behalten, die ein oder mehrere Kriterien erfüllen. Zum Formulieren der Kriterien stehen verschiedene Operatoren zur Verfügung, die unten demonstriert werden. Wie im vorherigen Kapitel verwenden wir den Datensatz mpg, um die Funktion zu demonstrieren. Laden Sie tidyverse (das dplyr und den Datensatz mpg enthält).
library(tidyverse)Im Folgenden werden verschiedene Beispiele für die Verwendung von filter() gezeigt.
Beispiel: Alle Zeilen mit einem Wert von mindestens 2 in der Variablen displ behalten:
mpg |> filter(displ >= 2)## A tibble: 212 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2 2008 4 manual(m6) f 20 31 p compact
audi a4 2 2008 4 auto(av) f 21 30 p compact
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
## Gekürzte AusgabeBeispiel: Alle Zeilen behalten, bei denen displ mindestens 2 beträgt, class gleich "compact" ist und cyl größer als der Mittelwert von cyl ist:
mpg |> filter(displ >= 2 & class =="compact" & cyl > mean(cyl))## A tibble: 13 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact
audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact
## Gekürzte Ausgabefilter() lässt sich mit group_by() kombinieren, um innerhalb jeder Gruppe getrennt zu filtern. Das ist sehr nützlich, wenn eine Bedingung zwischen Gruppen variieren soll. Angenommen, wir möchten alle Zeilen behalten, bei denen cyl größer ist als der Mittelwert von cyl innerhalb des jeweiligen Autoherstellers (die Variable manufacturer bezeichnet den Autohersteller):
mpg |>
group_by(manufacturer) |>
filter(cyl > mean(cyl))## A tibble: 109 × 11
## Groups: manufacturer [11]
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact
audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact
## Gekürzte AusgabeFiltern mit expliziter Angabe fehlender Werte (NA)
Beobachtungen, die in einer Variablen, die Teil eines filter()-Kriteriums ist, einen fehlenden Wert (Missing) aufweisen, werden nicht ausgewertet und können daher nicht behalten werden. Fehlende Werte werden mit NA (Not Available) angegeben. Erstellen wir Übungsdaten, um zu zeigen, wie fehlende Werte in filter() angegeben werden können. Wir erzeugen die Daten mit der Funktion tibble(), mit der sich Data Frames erstellen lassen:
## Daten erstellen
my_data <- tibble(Var1 = c(NA, 5, 9),
Var2 = c(1, NA, 3),
Var3 = c("Ja", "Nej", NA))
## Daten ansehen
my_data Var1 Var2 Var3
NA 1 Ja
5 NA Nej
9 3 NAIn jeder Zeile gibt es ein NA. Versuchen wir nun, mit je einer Bedingung pro Variable zu filtern:
my_data |> filter(Var1>4, Var2<10, Var3=="Ja")## A tibble: 0 × 3Wie oben zu sehen ist, bleibt keine Zeile übrig! Das liegt daran, dass der ersten Beobachtung die Information (NA) in Var1 fehlt, wodurch sie ausgeschlossen wird. Dem zweiten Patienten fehlt die Information in Var2, wodurch die Beobachtung ausgeschlossen wird. Der dritten Beobachtung fehlt die Information in Var3, wodurch auch sie ausgeschlossen wird, sodass keine Beobachtungen übrig bleiben.
Um dieses Problem zu lösen, gibt es die Funktion is.na(). Sie wird folgendermaßen verwendet:
is.na()prüft, ob ein Wert fehlt. Fehlt der Wert, ist die Bedingung erfüllt.!is.na()prüft, ob ein Wert nicht fehlt, d. h. ob der Wert vorhanden ist. Der Operator!bedeutet in R "Gegenteil" bzw. "nicht". Die Bedingung!is.na()bedeutet somit "fehlt nicht".
Im nächsten Beispiel behalten wir Zeilen, bei denen Var1 größer als 6 ist oder fehlt. In R wird | verwendet, um "oder" anzugeben. Der Code lautet wie folgt:
my_data |> filter(Var1>6 | is.na(Var1)) Var1 Var2 Var3
NA 1 Ja
9 3 NAFiltern mit einem numerischen Wertebereich
Ein numerischer Wertebereich lässt sich mit %in% angeben, das als "in" gelesen wird. Es folgen zwei Beispiele, die alle Zeilen behalten, bei denen Var1 eine der Zahlen 0, 1, 2, 3, 4, 5, 6 ist. Im ersten Beispiel wird %in% mit : kombiniert, im zweiten mit c().
## Beispiel 1
my_data |> filter(Var1 %in% 0:6)
## Beispiel 2
my_data |> filter(Var1 %in% c(0, 1, 2, 3, 4, 5, 6)) Var1 Var2 Var3
5 NA NejFiltern mit einem kategorialen Wertebereich
Auch ein kategorialer Wertebereich lässt sich mit %in% angeben. Hier behalten wir alle Zeilen, bei denen Var3 entweder "Ja" oder "Nej" entspricht:
my_data |> filter(Var3 %in% c("Ja", "Nej")) Var1 Var2 Var3
NA 1 Ja
5 NA Nej