R Select(), Filter(), Arrange(), Pipeline mit Beispiel
⚡ Intelligente Zusammenfassung
Select, Filter und Arrange in R sind die drei dplyr-Befehle, mit denen sich ein Dataframe auf die benötigten Spalten, Zeilen und die gewünschte Reihenfolge reduzieren lässt. In diesem Beispiel werden sie mithilfe des Pipe-Operators auf einen Datensatz mit Reisezeiten (205 Zeilen) angewendet.
Was ist dplyr in R?
dplyr ist das Datenmanipulationspaket des tidyverse. Es ersetzt die Klammernotation der Basis. R Mit einer kleinen Anzahl von Verben, die jeweils nach der von ihnen ausgeführten Aktion benannt sind und den Datenrahmen als erstes Argument verwenden. Diese einheitliche Struktur ermöglicht es, die Verben zu verketten.
| Verb | Handlungen auf | Was sie tut, |
|---|---|---|
| wählen() | Spalten | Behält oder entfernt Variablen |
| Filter() | Reihen | Hält Zeilen aufrecht, die einer Bedingung entsprechen |
| arrangieren() | Reihen | Ordnet die Zeilen anhand einer oder mehrerer Spalten neu an |
| mutieren() | Spalten | Erstellt oder ändert eine Variable |
| zusammenfassen() | Ganzer Tisch | Fasst viele Zeilen zu einer einzigen Statistik zusammen |
| group_by() | Ganzer Tisch | Teilt die Daten auf, sodass spätere Verben pro Gruppe ausgeführt werden. |
Dieses Tutorial behandelt die ersten drei Verben sowie den Pipe-Operator. Tutorial zur Aggregatfunktion behandelt group_by() und summarise() ausführlich.
In diesem Tutorial verwendeter Datensatz
Die Bibliothek dplyr enthält nützliche Befehle zur Navigation innerhalb des Datensatzes. In diesem Tutorial verwenden Sie den Datensatz „Reisezeiten“. Dieser Datensatz erfasst die Fahrten eines Fahrers zwischen seinem Wohnort und seinem Arbeitsplatz. Er enthält vierzehn Variablen, darunter:
- DayOfWeek: Identifizieren Sie den Wochentag, an dem der Fahrer sein Auto nutzt
- Distanz: Die Gesamtdistanz der Fahrt
- MaxSpeed: Die maximale Geschwindigkeit der Fahrt
- TotalTime: Die Länge der Fahrt in Minuten
Der Datensatz umfasst 205 Beobachtungen, und die Fahrten fanden statt vom Monday bis Freitag.
Zunächst müssen Sie Folgendes tun:
- Laden Sie den Datensatz
- Überprüfen Sie die Struktur der Daten.
Eine praktische dplyr-Funktion ist glimpse(). Sie erfüllt dieselbe Funktion wie die Basis-R-Funktion str(), gibt aber pro Variable eine Zeile mit dem Typ und den ersten paar Werten aus, was das Durchsuchen großer Datensätze wesentlich erleichtert.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Ausgang:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
Die Variable „Kommentare“ muss eindeutig genauer betrachtet werden: Die ersten Einträge sind alle leer.
sum(df$Comments =="")
Code Erläuterung
- sum(df$Comments == “”): Zählt die Einträge, deren Kommentarspalte in df leer ist.
Ausgang:
## [1] 181
Nachdem die Daten geladen sind, beginnen Sie mit dem Verb, das die Spalten kürzt.
wählen()
Wir beginnen mit dem Verb select(). Wir benötigen nicht unbedingt alle Variablen und es empfiehlt sich, nur die Variablen auszuwählen, die Sie für relevant halten.
Wir haben 181 fehlende Beobachtungen, fast 90 Prozent des Datensatzes. Wenn Sie sie ausschließen, können Sie die Analyse nicht fortsetzen.
Die andere Möglichkeit besteht darin, die Variable Comment mit dem Verb select() zu löschen.
Mit select() können wir Variablen auf unterschiedliche Weise auswählen. Beachten Sie, dass das erste Argument der Datensatz ist.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Mit der dritten Möglichkeit können Sie die Variable „Kommentare“ ausschließen.
step_1_df <- select(df, -Comments) dim(df)
Ausgang:
## [1] 205 14
dim(step_1_df)
Ausgang:
## [1] 205 13
Der ursprüngliche Datensatz verfügt über 14 Funktionen, während „step_1_df“ über 13 verfügt.
select()-Hilfsfunktionen in R
Die Benennung jeder einzelnen Spalte wird unpraktisch, sobald ein Datensatz Dutzende von Variablen enthält. dplyr bietet daher Hilfsfunktionen, mit denen Spalten stattdessen anhand eines Musters oder eines Datentyps ausgewählt werden können.
| Helfer | Wählt Spalten aus, die | Beispiel |
|---|---|---|
| beginnt mit ( | Beginnen Sie mit einer Zeichenkette | select(df, starts_with(“Avg”)) |
| endet mit ( | Schließen Sie mit einer Zeichenkette ab. | select(df, ends_with(“Time”)) |
| enthält() | Enthält eine beliebige Zeichenkette | select(df, contains(“Speed”)) |
| Streichhölzer() | einen regulären Ausdruck abgleichen | select(df, matches(“^Max|^Avg”)) |
| Wo() | Einen Typtest bestehen | select(df, where(is.numeric)) |
| alles() | Sie wurden noch nicht benannt | select(df, TotalTime, everything()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
Zwei weitere Verben lassen sich natürlich mit `select()` kombinieren. Verwenden Sie `rename(new_name = old_name)`, um eine Spalte umzubenennen, ohne sie zu löschen.ping die anderen, und relocate(), um Spalten zu verschieben, ohne sie alle aufzulisten.
Filter()
Der Verb `filter()` behält die Beobachtungen bei, die eine Bedingung erfüllen. `filter()` funktioniert genau wie `select()`: Man übergibt zuerst den Datenrahmen und dann eine durch Komma getrennte Bedingung.
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Ein Kriterium
Zunächst können Sie die Anzahl der Beobachtungen innerhalb jeder Ebene einer Faktorvariablen zählen.
table(step_1_df$GoingTo)
Code Erläuterung
- table(): Zählt die Anzahl der Beobachtungen pro Stufe. Die Funktion erwartet eine Faktor- oder Zeichenkettenvariable.
- table(step_1_df$GoingTo): Zähle die Anzahl der Fahrten zu jedem Zielort
Ausgang:
## ## GSK Home ## 105 100
Die Funktion table() gibt an, dass 105 Fahrten nach GSK und 100 nach Home gehen.
Wir können die Daten filtern, um einen Datensatz mit 105 Beobachtungen und einen anderen mit 100 Beobachtungen zurückzugeben.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Ausgang:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Ausgang:
## [1] 105 14
Mehrere Kriterien
Wir können einen Datensatz anhand mehrerer Kriterien filtern. Zum Beispiel können Sie …tracbei den Beobachtungen, bei denen das Ziel „Zuhause“ ist und die Reise an einem Mittwoch stattfand.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Ausgang:
## [1] 23 14
23 Beobachtungen erfüllten dieses Kriterium.
Allgemeine filter()-Bedingungen und OperaToren in R
Die Funktion `filter()` behält alle Zeilen bei, für die die Bedingung den Wert `TRUE` ergibt. Zeilen mit dem Wert `NA` werden verworfen, ein Verhalten, das die meisten Anfänger überrascht.
| OperaDo. | Bedeutung | Beispiel |
|---|---|---|
| == | Gleich | filter(df, GoingTo == “Home”) |
| != | Nicht gleichzusetzen mit | filter(df, DayOfWeek != “Monday") |
| & | UND beide müssen gelten | filter(df, Distanz > 50 & Maximalgeschwindigkeit > 130) |
| | | Oder, eines von beiden kann gelten | filter(df, DayOfWeek == “Monday| Wochentag == „Freitag“) |
| %In% | Passt zu jedem Wert in einem Vektor | filter(df, DayOfWeek %in% c(“Monday", "Freitag")) |
| zwischen() | Liegt innerhalb eines Zahlenbereichs | filter(df, between(Distance, 48, 52)) |
| is.na() | Es handelt sich um einen fehlenden Wert. | filter(df, is.na(FuelEconomy)) |
Drei Gewohnheiten verhindern die meisten Fehler in der filter()-Funktion.
- Verwenden Sie %in% anstelle von verketteten OR-Operatoren. filter(df, DayOfWeek %in% c(“Monday“, “Friday”)) ist kürzer und viel schwieriger falsch zu tippen als zwei == Vergleiche, die durch einen senkrechten Strich verbunden sind.
- Fehlende Werte sollten niemals mit == geprüft werden. Der Ausdruck x == NA gibt NA und nicht TRUE zurück, daher wird die Zeile stillschweigend verworfen. Verwenden Sie stattdessen is.na(x).
- Kommas bedeuten UND. filter(df, a, b) ist identisch mit filter(df, a & b), weshalb das Beispiel weiter oben in diesem Tutorial in beiden Fällen funktioniert.
Das Rohr Operator in dplyr
Die Erstellung eines Datensatzes erfordert zahlreiche Vorgänge, beispielsweise:
- Einfuhr
- Verschmelzung
- Auswahl
- Filterung
- usw.
Die dplyr-Bibliothek verfügt über einen praktischen Operator, %>%, genannt RohrDadurch wird die Datenmanipulation sauberer, schneller und weniger fehleranfällig.
Dieser Operator ist ein Code, der Schritte ausführt, ohne Zwischenschritte auf der Festplatte zu speichern. Wenn Sie zu unserem Beispiel von oben zurückkehren, können Sie die gewünschten Variablen auswählen und filtern. Wir haben drei Schritte:
- Schritt 1: Daten importieren: Importieren Sie die GPS-Daten
- Schritt 2: Daten auswählen: Wählen Sie „GoingTo“ und „DayOfWeek“.
- Schritt 3: Daten filtern: Nur „Heim“ und „Mittwoch“ zurückgeben
Wir können es auf die harte Tour machen:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Ausgang:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Das ist keine praktikable Methode, um viele Operationen zu verketten. Jedes Zwischenergebnis verbleibt in der Umgebung, und die Namen verlieren schnell ihre Bedeutung.
Verwenden Sie stattdessen den Pipe-Operator %>%. Sie benennen den Datenrahmen einmal am Anfang, und jeder weitere Schritt basiert darauf.
Grundlegende Syntax der Pipeline
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: the last instruction does not need a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints in the console.
Sie können Ihre erste Pipe erstellen, indem Sie die oben aufgeführten Schritte befolgen.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) %>% #Step 2 select(GoingTo, DayOfWeek) %>% #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Ausgang:
## [1] TRUE
Da die beiden Objekte identisch sind, liefert die Pipe genau dasselbe Ergebnis in einer einzigen lesbaren Anweisung.
arrangieren()
Im vorheriges Tutorialerfahren Sie, wie Sie die Werte mit der Funktion sort() sortieren. Die Bibliothek dplyr hat ihre Sortierfunktion. Es funktioniert wunderbar mit der Pipeline. Das Verb „arrange()“ kann eine oder mehrere Zeilen entweder aufsteigend (Standard) oder absteigend neu anordnen.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Wir können die Entfernung nach Zielort sortieren.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Ausgang:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
dplyr-Verben in R: Kurzübersicht
Die folgende Tabelle listet alle in diesem Tutorial verwendeten Verben mit ihrer Syntax und dem jeweiligen Rückgabewert auf:
| Verb | Ziel | Code | Erläuterung |
|---|---|---|---|
| Blick | Überprüfen Sie die Struktur eines df |
glimpse(df)
|
Gleicher Zweck wie str(), leichter zu lesen |
| wählen() | Variablen auswählen/ausschließen |
select(df, A, B ,C)
|
Wählen Sie die Variablen A, B und C aus |
select(df, A:C)
|
Wählen Sie alle Variablen von A bis C aus | ||
select(df, -C)
|
C ausschließen | ||
| Filter() | Stellen Sie sicher, dass die Zeilen einer oder mehreren Bedingungen entsprechen. |
filter(df, condition1)
|
Eine Bedingung |
filter(df, condition1 & condition2)
|
Zwei Bedingungen kombiniert mit UND | ||
| arrangieren() | Sortieren Sie den Datensatz nach einer oder mehreren Variablen |
arrange(A)
|
Aufsteigende Art der Variablen A |
arrange(A, B)
|
Aufsteigende Art der Variablen A und B | ||
arrange(desc(A), B)
|
Absteigende Art von Variable A und aufsteigende Art von B | ||
| %>% | Erstellen Sie zwischen jedem Schritt eine Pipeline |
step 1 %>% step 2 %>% step 3 |

