R Select(), Filter(), Arrange(), Pipeline mit Beispiel

Die Bibliothek namens dplyr enthält wertvolle Verben für die Navigation im Datensatz. In diesem Tutorial verwenden Sie den Datensatz „Reisezeiten“. Der Datensatz sammelt Informationen über die Fahrt, die ein Fahrer zwischen seinem Wohnort und seinem Arbeitsplatz zurücklegt. Der Datensatz 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 enthält etwa 200 Beobachtungen, und die Fahrten fanden dazwischen statt Monday bis Freitag.

Zunächst müssen Sie Folgendes tun:

  • Laden Sie den Datensatz
  • Überprüfen Sie die Struktur der Daten.

Eine praktische Funktion von dplyr ist die Funktion glimpse(). Dies ist eine Verbesserung gegenüber str(). Wir können glimpse() verwenden, um die Struktur des Datensatzes anzuzeigen und zu entscheiden, welche Manipulation erforderlich ist.

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...	

Dies ist offensichtlich, dass die Variable Kommentare einer weiteren Diagnose bedarf. Bei den ersten Beobachtungen der Variable „Kommentare“ handelt es sich lediglich um fehlende Werte.

sum(df$Comments =="")

Code Erklärung

  • sum(df$Comments ==““): Summiert die Beobachtungen, die „“ in den Spaltenkommentaren von df ergeben

Ausgang:

## [1] 181

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.

Filter()

Das Verb filter() hilft dabei, die Beobachtungen einem bestimmten Kriterium zuzuordnen. filter() funktioniert genau wie select(), Sie übergeben 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 Erklärung

  • table(): Zählt die Anzahl der Beobachtungen nach Ebene. Beachten Sie, dass nur Variablen auf Faktorebene akzeptiert werden
  • table(step_1_df$GoingTo): Zählt die Anzahl der Fahrten zum endgültigen Ziel.

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
if GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Ausgang:

## [1] 100  14
# Select observations
if GoingTo == Work
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Ausgang:

## [1] 105  14

Mehrere Kriterien

Wir können einen Datensatz nach mehr als einem Kriterium filtern. Beispielsweise können Sie die Beobachtungen extrahieren, bei denen das Ziel „Zuhause“ ist und die an einem Mittwoch stattfanden.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Ausgang:

## [1] 23 14

23 Beobachtungen erfüllten dieses Kriterium.

Pipeline

Die Erstellung eines Datensatzes erfordert zahlreiche Vorgänge, beispielsweise:

  • Einfuhr
  • Verschmelzung
  • Auswahl
  • Filterung
  • usw.

Die dplyr-Bibliothek verfügt über einen praktischen Operator, %>%, genannt Pipeline. Die Pipeline-Funktion macht die Manipulation sauber, schnell 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	

Dies ist keine praktische Methode zum Ausführen vieler Vorgänge, insbesondere in einer Situation mit vielen Schritten. In der Umgebung werden am Ende viele Objekte gespeichert.

Verwenden wir stattdessen den Pipeline-Operator %>%. Wir müssen nur den am Anfang verwendeten Datenrahmen definieren und der gesamte Prozess wird daraus abgeleitet.

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 the pipe operator `%`, you don't have instructions to pipe anymore
Note: Create a new variable is optional. If not included, the output will be displayed 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

Wir sind bereit, mit dem Pipeline-Betreiber einen beeindruckenden Datensatz zu erstellen.

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

Zusammenfassung

In der folgenden Tabelle sind alle Operationen zusammengefasst, die Sie im Lernprogramm gelernt haben.

Verb Ziel Code Erläuterung
Blick Überprüfen Sie die Struktur eines df
glimpse(df)
Identisch mit str()
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() Filtern Sie den df basierend auf einer oder mehreren Bedingungen
filter(df, condition1)
Eine Bedingung
filter(df, condition1
Bedingung2)
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