dplyr vereinfacht den Umgang mit Data Frames

Die Arbeit mit Data Frames in R kann ganz schon mühsam sein, es sei denn, man benutzt dplyr. Dieser Artikel führt durch die nützlichsten Funktionen dieses praktischen R-Packages.
Als Datensatz dient airquality aus dem Paket datasets. Er enthält 153 Messungen von 6 Variablen bezüglich der Luftqualität in New York zwischen dem 1. Mai und dem 30. September 1973. Nach der Laden der benötigten Pakete verschaffen wir uns zunächst einen Überblick über den Aufbau des Datensatzes:

> library(dplyr)
> library(datasets) 
> head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6 

Optional lässt sich der Data Frame mit airquality <- tbl_df(airquality) in einen "local data frame" umwandeln, der insbesondere bei großen Datenmengen eine schönere Ausgabe hat.

Die Select-Funktion

Mit select() lässt sich eine oder mehrere Spalten in einem Data Frame auswählen. Zunächst wird der Data Frame angegeben, dann die anzuzeigenden Spalten in der gewünschten Reihenfolge.

> s1 <- select(airquality, Wind, Temp)
> head(s1)
Source: local data frame [6 x 2]
  Wind Temp
1  7.4   67
2  8.0   72
3 12.6   74
4 11.5   62
5 14.3   56
6 14.9   66

Um alle Spalten bis auf eine bestimmte auszuwählen, verwendest du "-" (Minus-Operator). Nachfolgend wird Solar.R ausgeblendet. Analog lässt sich auch der Colon-Operator ":" einsetzen.

> s2 <- select(airquality, -Solar.R)
> head(s2)
Source: local data frame [6 x 5]
  Ozone Wind Temp Month Day
1    41  7.4   67     5   1
2    36  8.0   72     5   2
3    12 12.6   74     5   3
4    18 11.5   62     5   4
5    NA 14.3   56     5   5
6    28 14.9   66     5   6

> s3 <- select(airquality, Ozone:Temp)
> head(s3)
Source: local data frame [6 x 4]
  Ozone Solar.R Wind Temp
1    41     190  7.4   67
2    36     118  8.0   72
3    12     149 12.6   74
4    18     313 11.5   62
5    NA      NA 14.3   56
6    28      NA 14.9   66

Es gibt noch weitere Möglichkeiten, eine Auswahl der Spalten zu treffen: ends_with("nt") selektiert alle Spalten, die auf nt enden. Ähnlich funktionieren starts_with(), contains(), one_of() und matches().

Die Filter-Funktion

Die Funktion filter() ist der Funktion select() sehr ähnlich. Nur werden hier Reihen ausgewählt und nicht Spalten.

> f1 <- filter(airquality, Temp > 90)
Source: local data frame [14 x 6]
   Ozone Solar.R Wind Temp Month Day
1     NA     259 10.9   93     6  11
2     NA     250  9.2   92     6  12
3     97     267  6.3   92     7   8
4     97     272  5.7   92     7   9
5     NA     291 14.9   91     7  14
6     NA     222  8.6   92     8  10
7     76     203  9.7   97     8  28
8    118     225  2.3   94     8  29
9     84     237  6.3   96     8  30
10    85     188  6.3   94     8  31
11    96     167  6.9   91     9   1
12    78     197  5.1   92     9   2
13    73     183  2.8   93     9   3
14    91     189  4.6   93     9   4

Es war also an 14 Tagen kuschelig warm in New York. Um mehrere Bedingungen zu verknüpfen, kannst du das Zeichen "&" oder das Komma verwenden. filter(airquality, Temp > 90 & Month == 9) ist also das gleiche wie filter(airquality, Temp > 90, Month == 9)

Der Pipe-Operator

Piping oder Chaining ist die coolste Funktion von dplyr. Sie wird aus dem Paket magrittr importiert. Damit lässt sich das Ergebnis einer Funktion als Input für eine andere Funktion verwenden. Der Operator hat das Zeichen %>%, gelesen als "then".

> airquality %>%
+   select(Ozone, Month, Day) %>%
+   filter(Ozone > 100)
Source: local data frame [7 x 3]
  Ozone Month Day
1   115     5  30
2   135     7   1
3   108     7  25
4   122     8   7
5   110     8   9
6   168     8  25
7   118     8  29

Die Verwendung des Pipe-Operators spart zudem viel Tipparbeit, da man nicht immer wieder den Namen des Data Frames wiederholen muss, und macht den Code leichter lesbar. An 7 Tagen war also richtig dicke Luft in New York.

Die Arrange-Funktion

Mit arrange() lassen sich Daten ordnen. Dabei sortiert die Funktion von der kleinsten zur größten Zahl oder von A bis Z. Wenn die Spalte Buchstaben und Nummern enthält, dann wird erst nach Buchstabe und dann nach Zahl sortiert. desc() kehrt die Reihenfolge um. Der folgende Befehl sortiert den Data Frame absteigend nach Temperatur, dann aufsteigend nach Monat und Tag – mit Pipelining.

> airquality %>% 
+   arrange(desc(Temp), Month, Day) %>%
+   head
Source: local data frame [6 x 6]
  Ozone Solar.R Wind Temp Month Day
1    76     203  9.7   97     8  28
2    84     237  6.3   96     8  30
3   118     225  2.3   94     8  29
4    85     188  6.3   94     8  31
5    NA     259 10.9   93     6  11
6    73     183  2.8   93     9   3
Die Mutate-Funktion

Die Funktion mutate() fügt neue Spalten zum Data Frame hinzu, im Beispiel die Temperatur in Grad Celsius, die anschließend auf eine Nachkommastelle gerundet wird.

> airquality <- mutate(airquality, Celsius = (Temp - 32) * 5 / 9)
> airquality$Celsius  <- round(airquality$Celsius, digits = 1)
> head(airquality)
Source: local data frame [6 x 7]
  Ozone Solar.R Wind Temp Month Day Celsius
1    41     190  7.4   67     5   1    19.4
2    36     118  8.0   72     5   2    22.2
3    12     149 12.6   74     5   3    23.3
4    18     313 11.5   62     5   4    16.7
5    NA      NA 14.3   56     5   5    13.3
6    28      NA 14.9   66     5   6    18.9
Die Summarise-Funktion

Die Funktion summarise() erstellt Statistiken für eine bestimmte Spalte und berechnet etwa den Mittelwert und bestimmt Maximum und Minimum. Der Parameter na.rm = TRUE bewirkt, dass eventuell auftretende NA-Werte ignoriert werden.

> airquality %>%
+   summarise(Temp_max = max(Celsius),
+             Temp_min = min(Celsius),
+             Temp_mean = mean(Celsius, na.rm = TRUE),
+             total = n())
Source: local data frame [1 x 4]
  Temp_max Temp_min Temp_mean total
1     36.1     13.3  25.48758   153
Die Group-by-Funktion

Das ist eine wichtige Funktion in dplyr, denn damit lassen sich Gruppen erstellen, in denen dann jeweils bestimmte Operationen stattfinden. Am Ende werden alle Gruppen wieder im Data Frame zusammengefügt. Das Beispiel berechnet die durchschnittliche Temperatur für jeden Monat. Die Monate sind also die Gruppen.

> airquality %>%
+   group_by(Month) %>%
+   summarise(mean(Celsius, na.rm = TRUE))
Source: local data frame [5 x 2]
  Month mean(Celsius, na.rm = TRUE)
1     5                    18.63226
2     6                    26.16333
3     7                    28.82903
4     8                    28.86774
5     9                    24.95000