Was dplyr ist
dplyr ist R's beliebtestes Paket zur Datenmanipulation - eine "Grammatik der Daten", aufgebaut aus einer Handvoll Verben. Jedes Verb ist eine Funktion, die einen Data Frame entgegennimmt, genau eine Aufgabe erledigt (Zeilen behalten, eine Spalte hinzufügen, eine Gruppenzusammenfassung berechnen) und einen neuen Data Frame zurückgibt. Weil jedes Verb dieselbe Form hat - Data Frame rein, Data Frame raus -, lassen sie sich mit der Pipe zu Pipelines zusammenstecken, die sich von oben nach unten wie ein Rezept lesen. dplyr ist der Kern des tidyverse, einer Familie von Paketen (tidyr, ggplot2, readr), die dieses Design teilen.
Alles, was dplyr tut, kann auch Base R. Hier eine kleine Analyse in reinem Base R - die eingebauten mtcars-Daten auf 4-Zylinder-Autos filtern, eine neue Spalte berechnen und sie pro Ganganzahl mitteln. Dieses Beispiel ist lauffähig:
Das funktioniert, und es ist gutes R. Aber man sieht, wie sich die Geschichte über Klammer-Indexierung, eine $-Zuweisung und eine Formel verschmiert. Die dplyr-Version derselben Analyse:
library(dplyr)
mtcars |>
filter(cyl == 4) |>
mutate(kml = mpg * 0.425) |>
group_by(gear) |>
summarize(avg_kml = round(mean(kml), 1))
Vier Verben, in der Reihenfolge, in der man es laut erklären würde. Diese Lesbarkeit ist das gesamte Verkaufsargument, und bei einer zwanzigstufigen Pipeline ist sie entscheidend.
Die dplyr-Snippets auf dieser Seite sind statisch, weil dieser Editor nur Base R ausführt - um sie auszuführen, installiere dplyr auf deinem eigenen Rechner, wie im nächsten Abschnitt gezeigt.
Installieren und Laden
Einmalig installieren, dann in jedem Skript laden, das es verwendet:
install.packages("dplyr") # once, per machine
library(dplyr) # every script
Wer stattdessen install.packages("tidyverse") installiert, bekommt dplyr plus seine Schwesterpakete. Beim Laden warnt dplyr, dass es stats::filter und stats::lag maskiert - das ist normal, kein Fehler.
Die sechs Kern-Verben
Jedes Verb nimmt den Data Frame als erstes Argument und Spaltennamen nackt, ohne Anführungszeichen oder df$-Präfixe.
filter() behält Zeilen, die eine Bedingung erfüllen:
mtcars |> filter(mpg > 25)
mtcars |> filter(cyl == 4, hp < 70) # comma = AND
select() behält Spalten nach Name, Bereich oder Helfer:
mtcars |> select(mpg, cyl, hp)
mtcars |> select(mpg:hp) # a range of adjacent columns
mtcars |> select(starts_with("d")) # disp, drat
mutate() fügt Spalten hinzu oder transformiert sie:
mtcars |> mutate(kml = mpg * 0.425, heavy = wt > 3.5)
arrange() sortiert Zeilen - eine Spalte in desc() einwickeln für absteigende Sortierung:
mtcars |> arrange(desc(mpg))
summarize() verdichtet Zeilen zu einer Zusammenfassungszeile, und group_by() lässt es stattdessen pro Gruppe verdichten:
mtcars |>
group_by(cyl) |>
summarize(n = n(), avg_mpg = mean(mpg))
group_by() tut für sich genommen nichts Sichtbares - es markiert nur den Data Frame, damit das nächste summarize() (oder mutate()) gruppenweise arbeitet. Jedes Verb hat eine eigene ausführliche Doku in diesem Kapitel: Zeilen filtern, Spalten hinzufügen, Sortieren und gruppierte Zusammenfassungen.
Verben mit der Pipe verketten
Die Pipe |> nimmt den Wert vor ihr und übergibt ihn als erstes Argument an die Funktion nach ihr - x |> f(y) bedeutet f(x, y). Da jedes dplyr-Verb einen Data Frame entgegennimmt und zurückgibt, lassen sich Verben beliebig verketten:
mtcars |>
filter(hp > 100) |>
mutate(kml = mpg * 0.425) |>
group_by(cyl) |>
summarize(cars = n(), avg_kml = round(mean(kml), 1)) |>
arrange(desc(avg_kml))
Lies es laut: Nimm mtcars, behalte Autos über 100 PS, füge eine Kilometer-pro-Liter-Spalte hinzu, gruppiere nach Zylindern, zähle und mittle jede Gruppe, sortiere nach dem Durchschnitt. Keine Zwischenvariablen, keine Verschachtelung. Älterer Code verwendet %>% aus dem magrittr-Paket statt |> - für dplyr-Arbeit sind sie austauschbar, und |> (ab R 4.1 eingebaut) wird in der Pipes-Doku behandelt.
count() und n(): die Zähl-Helfer
Zählen ist so häufig, dass dplyr Abkürzungen dafür hat. n() liefert die Zeilenanzahl der aktuellen Gruppe (nur innerhalb von summarize() oder mutate() gültig), und count() verdichtet den ganzen group_by() + summarize(n = n())-Tanz auf einen einzigen Aufruf:
mtcars |> count(cyl) # rows per cyl value
mtcars |> count(cyl, gear, sort = TRUE) # two groupers, biggest first
Wenn du dich dabei erwischst, group_by(x) |> summarize(n = n()) zu schreiben, ersetze es durch count(x).
Eine Anmerkung zu Tibbles
dplyr-Verben geben oft ein Tibble zurück - die tidyverse-Variante eines Data Frames. Es ist ein Data Frame (alles, was einen akzeptiert, akzeptiert auch ein Tibble), mit freundlicherer Ausgabe: nur die ersten 10 Zeilen, nur die Spalten, die passen, mit den Typen unter jedem Namen. Zwei Unterschiede lohnt es zu kennen: Tibbles verwenden nie Zeilennamen (weshalb mtcars |> as_tibble() die Autonamen verliert - das tidyverse erwartet, dass Bezeichner in einer echten Spalte leben), und Indexierung mit einfachen Klammern gibt immer ein Tibble zurück, statt manchmal auf einen Vektor zu reduzieren. Keins von beidem sollte dich im Alltag überraschen; gerate nur nicht in Panik, wenn str() tbl_df anzeigt.
Was du mitnimmst
- dplyr ist eine Grammatik: sechs Verben, jedes erledigt eine Aufgabe an einem Data Frame, verkettet mit der Pipe.
filter()wählt Zeilen,select()wählt Spalten,mutate()fügt Spalten hinzu,arrange()sortiert,group_by() + summarize()aggregiert.x |> f(y)istf(x, y)- Pipelines lesen sich von oben nach unten in der Reihenfolge des Geschehens.count()undn()decken die meisten Zählbedürfnisse ab.- Base R kann all das; dplyr gewinnt bei der Lesbarkeit, sobald Pipelines wachsen.
Als Nächstes: Filtern und Subsetting im Detail - die Base-R-Klammer-Idiome und wo dplyr's filter() hineinpasst.
Häufig gestellte Fragen
Was ist dplyr in R?
dplyr ist das meistgenutzte R-Paket zur Manipulation von Data Frames. Es stellt eine kleine Menge von Verben bereit - filter(), select(), mutate(), arrange(), summarize(), group_by() -, die jeweils genau eine Sache mit einem Data Frame tun und sich mit der Pipe zu lesbaren Pipelines verketten lassen. Es ist Teil des tidyverse.
Wie installiere ich dplyr?
Einmalig install.packages("dplyr") ausführen, dann library(dplyr) am Anfang jedes Skripts, das es verwendet. Wer stattdessen tidyverse installiert, bekommt dplyr plus seine Schwesterpakete (tidyr, ggplot2, readr) in einem Rutsch.
Brauche ich dplyr, oder reicht Base R?
Base R kann alles, was dplyr kann - Subsetting, aggregate(), order() -, und es lohnt sich, das zu kennen, weil es überall ohne Abhängigkeiten funktioniert. dplyr verdient sich seine Installation, sobald Pipelines länger werden: Fünf verkettete Verben lesen sich wie ein Satz, während das Base-Äquivalent wie ein verschachteltes Klammer-Puzzle wirkt.
Was ist der Unterschied zwischen summarize und summarise in dplyr?
Keiner. Es ist dieselbe Funktion in US- und UK-Schreibweise; dplyr exportiert beide. Verwende die Schreibweise deines Teams und bleib konsistent.