R-Aggregatfunktion: Beispiel für Summarise & Group_by()
Die Zusammenfassung einer Variablen ist wichtig, um sich ein Bild von den Daten zu machen. Allerdings liefert die Zusammenfassung einer Variablen nach Gruppen bessere Informationen über die Verteilung der Daten.
In diesem Tutorial erfahren Sie, wie Sie mit der dplyr-Bibliothek einen Datensatz nach Gruppen zusammenfassen.
Für dieses Tutorial verwenden Sie den Batting-Datensatz. Der ursprüngliche Datensatz enthält 102816 Beobachtungen und 22 Variablen. Sie verwenden nur 20 Prozent dieses Datensatzes und die folgenden Variablen:
- Spieler-ID: Spieler-ID-Code. Faktor
- yearID: Jahr. Faktor
- TeamID: Team. Faktor
- lgID: Liga. Faktor: AA AL FL NL PL UA
- AB: Bei Fledermäusen. Numerisch
- G: Spiele: Anzahl der Spiele eines Spielers. Numerisch
- R: Läuft. Numerisch
- HR: Homeruns. Numerisch
- SH: Sacrifice trifft. Numerisch
Bevor Sie eine Zusammenfassung durchführen, führen Sie die folgenden Schritte aus, um die Daten vorzubereiten:
- Schritt 1: Importieren Sie die Daten
- Schritt 2: Wählen Sie die relevanten Variablen aus
- Schritt 3: Sortieren Sie die Daten
library(dplyr) # Step 1 data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") % > % # Step 2 select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH)) % > % # Step 3 arrange(playerID, teamID, yearID)
Eine gute Vorgehensweise beim Importieren eines Datensatzes besteht darin, die Funktion glimpse() zu verwenden, um eine Vorstellung von der Struktur des Datensatzes zu erhalten.
# Structure of the data glimpse(data)
Ausgang:
Observations: 104,324 Variables: 9 $ playerID <fctr> aardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a... $ yearID <int> 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196... $ AB <int> 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495, ... $ teamID <fctr> ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A... $ lgID <fctr> NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL, ... $ G <int> 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15... $ R <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75... $ HR <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40... $ SH <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, ...
Zusammenfassen()
Die Syntax von summarise() ist einfach und konsistent mit den anderen in der dplyr-Bibliothek enthaltenen Verben.
summarise(df, variable_name=condition) arguments: - `df`: Dataset used to construct the summary statistics - `variable_name=condition`: Formula to create the new variable
Schauen Sie sich den folgenden Code an:
summarise(data, mean_run =mean(R))
Code Erklärung
- summarise(data, mean_run = mean(R)): Erstellt eine Variable mit dem Namen mean_run, die den Durchschnitt des Spaltenlaufs aus den Datensatzdaten darstellt.
Ausgang:
## mean_run ## 1 19.20114
Sie können so viele Variablen hinzufügen, wie Sie möchten. Sie erhalten die durchschnittliche Anzahl gespielter Spiele und die durchschnittlichen Opfertreffer.
summarise(data, mean_games = mean(G), mean_SH = mean(SH, na.rm = TRUE))
Code Erklärung
- mean_SH = mean(SH, na.rm = TRUE): Fassen Sie eine zweite Variable zusammen. Sie setzen na.rm = TRUE, weil die Spalte SH fehlende Beobachtungen enthält.
Ausgang:
## mean_games mean_SH ## 1 51.98361 2.340085
Group_by vs. kein group_by
Die Funktion summerise() ohne group_by() macht keinen Sinn. Es erstellt eine zusammenfassende Statistik nach Gruppe. Die Bibliothek dplyr Wendet eine Funktion automatisch auf die Gruppe an, die Sie im Verb „group_by“ übergeben haben.
Beachten Sie, dass group_by perfekt mit allen anderen Verben funktioniert (z. B. mutate(), filter(), array(), …).
Es ist praktisch, den Pipeline-Operator zu verwenden, wenn Sie mehr als einen Schritt haben. Sie können den durchschnittlichen Homerun pro Baseball-Liga berechnen.
data % > % group_by(lgID) % > % summarise(mean_run = mean(HR))
Code Erklärung
- Daten: Datensatz, der zum Erstellen der zusammenfassenden Statistik verwendet wird
- group_by(lgID): Berechnen Sie die Zusammenfassung, indem Sie die Variable „lgID“ gruppieren
- summarise(mean_run = mean(HR)): Berechnen Sie den durchschnittlichen Homerun
Ausgang:
## # A tibble: 7 x 2 ## lgID mean_run ## <fctr> <dbl> ## 1 AA 0.9166667 ## 2 AL 3.1270988 ## 3 FL 1.3131313 ## 4 NL 2.8595953 ## 5 PL 2.5789474 ## 6 UA 0.6216216 ## 7 <NA> 0.2867133
Der Pipe-Operator funktioniert auch mit ggplot(). Sie können die zusammenfassende Statistik ganz einfach mit einem Diagramm anzeigen. Alle Schritte werden in die Pipeline geschoben, bis das Diagramm dargestellt wird. Es erscheint anschaulicher, den durchschnittlichen Homerun pro Liga mit einem Balkendiagramm anzuzeigen. Der folgende Code demonstriert die Leistungsfähigkeit der Kombination von group_by(), summarise() und ggplot().
Sie führen den folgenden Schritt aus:
- Schritt 1: Datenrahmen auswählen
- Schritt 2: Daten gruppieren
- Schritt 3: Daten zusammenfassen
- Schritt 4: Zeichnen Sie die zusammenfassenden Statistiken auf
library(ggplot2) # Step 1 data % > % #Step 2 group_by(lgID) % > % #Step 3 summarise(mean_home_run = mean(HR)) % > % #Step 4 ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) + geom_bar(stat = "identity") + theme_classic() + labs( x = "baseball league", y = "Average home run", title = paste( "Example group_by() with summarise()" ) )
Ausgang:
Funktion in summary()
Das Verb summarise() ist mit fast allen Funktionen in R kompatibel. Hier ist eine kurze Liste nützlicher Funktionen, die Sie zusammen mit summarise() verwenden können:
Ziel | Funktion | BESCHREIBUNG |
---|---|---|
Grundlagen | bedeuten() | Durchschnitt des Vektors x |
Median() | Median des Vektors x | |
Summe() | Summe von Vektor x | |
Variation | SD() | Standardabweichung des Vektors x |
IQR() | Interquartil des Vektors x | |
Abdeckung | min () | Minimum des Vektors x |
max () | Maximum des Vektors x | |
Quantil() | Quantil des Vektors x | |
Position | zuerst() | Verwendung mit group_by() Erste Beobachtung der Gruppe |
zuletzt() | Verwendung mit group_by(). Letzte Beobachtung der Gruppe | |
nth() | Verwendung mit group_by(). n. Beobachtung der Gruppe | |
Zu Zählen | n () | Verwendung mit group_by(). Zählen Sie die Anzahl der Zeilen |
n_distinct() | Verwendung mit group_by(). Zählen Sie die Anzahl der eindeutigen Beobachtungen |
Wir werden Beispiele für alle Funktionen in Tabelle 1 sehen.
Grundfunktion
Im vorherigen Beispiel haben Sie die Zusammenfassungsstatistik nicht in einem Datenrahmen gespeichert.
Sie können in zwei Schritten vorgehen, um aus einer Zusammenfassung einen Datumsrahmen zu generieren:
- Schritt 1: Speichern Sie den Datenrahmen zur weiteren Verwendung
- Schritt 2: Verwenden Sie den Datensatz, um ein Liniendiagramm zu erstellen
Schritt 1) Sie berechnen die durchschnittliche Anzahl der pro Jahr gespielten Spiele.
## Mean ex1 <- data % > % group_by(yearID) % > % summarise(mean_game_year = mean(G)) head(ex1)
Code Erklärung
- Die zusammenfassende Statistik des Schlagdatensatzes wird im Datenrahmen ex1 gespeichert.
Ausgang:
## # A tibble: 6 x 2 ## yearID mean_game_year ## <int> <dbl> ## 1 1871 23.42308 ## 2 1872 18.37931 ## 3 1873 25.61538 ## 4 1874 39.05263 ## 5 1875 28.39535 ## 6 1876 35.90625
Schritt 2) Sie zeigen die zusammenfassende Statistik mit einem Liniendiagramm an und sehen den Trend.
# Plot the graph ggplot(ex1, aes(x = yearID, y = mean_game_year)) + geom_line() + theme_classic() + labs( x = "Year", y = "Average games played", title = paste( "Average games played from 1871 to 2016" ) )
Ausgang:
Untereinstellung
Die Funktion summarise() ist mit der Untergruppenbildung kompatibel.
## Subsetting + Median data % > % group_by(lgID) % > % summarise(median_at_bat_league = median(AB), #Compute the median without the zero median_at_bat_league_no_zero = median(AB[AB > 0]))
Code Erklärung
- median_at_bat_league_no_zero = median(AB[AB > 0]): Die Variable AB enthält viele 0. Sie können den Median der vergleichen Eine Fledermaus Variable mit und ohne 0.
Ausgang:
## # A tibble: 7 x 3 ## lgID median_at_bat_league median_at_bat_league_no_zero ## <fctr> <dbl> <dbl> ## 1 AA 130 131 ## 2 AL 38 85 ## 3 FL 88 97 ## 4 NL 56 67 ## 5 PL 238 238 ## 6 UA 35 35 ## 7 <NA> 101 101
Sum
Eine weitere nützliche Funktion zum Aggregieren der Variablen ist sum().
Sie können überprüfen, welche Ligen die meisten Homeruns haben.
## Sum data % > % group_by(lgID) % > % summarise(sum_homerun_league = sum(HR))
Ausgang:
## # A tibble: 7 x 2 ## lgID sum_homerun_league ## <fctr> <int> ## 1 AA 341 ## 2 AL 29426 ## 3 FL 130 ## 4 NL 29817 ## 5 PL 98 ## 6 UA 46 ## 7 <NA> 41
Standardabweichung
Die Streuung der Daten wird mit der Standardabweichung oder sd() in R berechnet.
# Spread data % > % group_by(teamID) % > % summarise(sd_at_bat_league = sd(HR))
Ausgang:
## # A tibble: 148 x 2 ## teamID sd_at_bat_league ## <fctr> <dbl> ## 1 ALT NA ## 2 ANA 8.7816395 ## 3 ARI 6.0765503 ## 4 ATL 8.5363863 ## 5 BAL 7.7350173 ## 6 BFN 1.3645163 ## 7 BFP 0.4472136 ## 8 BL1 0.6992059 ## 9 BL2 1.7106757 ## 10 BL3 1.0000000 ## # ... with 138 more rows
Es gibt große Ungleichheiten in der Anzahl der von den einzelnen Teams absolvierten Homeruns.
Minimum und Maximum
Mit den Funktionen min() und max() können Sie auf das Minimum und das Maximum eines Vektors zugreifen.
Der folgende Code gibt die niedrigste und höchste Anzahl von Spielen zurück, die ein Spieler in einer Saison gespielt hat.
# Min and max data % > % group_by(playerID) % > % summarise(min_G = min(G), max_G = max(G))
Ausgang:
## # A tibble: 10,395 x 3 ## playerID min_G max_G ## <fctr> <int> ## 1 aardsda01 53 73 ## 2 aaronha01 120 156 ## 3 aasedo01 24 66 ## 4 abadfe01 18 18 ## 5 abadijo01 11 11 ## 6 abbated01 3 153 ## 7 abbeybe01 11 11 ## 8 abbeych01 80 132 ## 9 abbotgl01 5 23 ## 10 abbotji01 13 29 ## # ... with 10,385 more rows
Zu Zählen
Es ist immer eine gute Idee, Beobachtungen nach Gruppen zu zählen. Mit R können Sie die Anzahl der Vorkommen mit n() aggregieren.
Der folgende Code berechnet beispielsweise die Anzahl der von jedem Spieler gespielten Jahre.
# count observations data % > % group_by(playerID) % > % summarise(number_year = n()) % > % arrange(desc(number_year))
Ausgang:
## # A tibble: 10,395 x 2 ## playerID number_year ## <fctr> <int> ## 1 pennohe01 11 ## 2 joosted01 10 ## 3 mcguide01 10 ## 4 rosepe01 10 ## 5 davisha01 9 ## 6 johnssi01 9 ## 7 kaatji01 9 ## 8 keelewi01 9 ## 9 marshmi01 9 ## 10 quirkja01 9 ## # ... with 10,385 more rows
Erstes und Letztes
Sie können die erste, letzte oder n-te Position einer Gruppe auswählen.
Sie können beispielsweise das erste und letzte Jahr jedes Spielers finden.
# first and last data % > % group_by(playerID) % > % summarise(first_appearance = first(yearID), last_appearance = last(yearID))
Ausgang:
## # A tibble: 10,395 x 3 ## playerID first_appearance last_appearance ## <fctr> <int> <int> ## 1 aardsda01 2009 2010 ## 2 aaronha01 1973 1975 ## 3 aasedo01 1986 1990 ## 4 abadfe01 2016 2016 ## 5 abadijo01 1875 1875 ## 6 abbated01 1905 1897 ## 7 abbeybe01 1894 1894 ## 8 abbeych01 1895 1897 ## 9 abbotgl01 1973 1979 ## 10 abbotji01 1992 1996 ## # ... with 10,385 more rows
n-te Beobachtung
Die Funktion nth() ist komplementär zu first() und last(). Sie können mit dem zurückzugebenden Index auf die n-te Beobachtung innerhalb einer Gruppe zugreifen.
Sie können beispielsweise nur das zweite Jahr filtern, in dem eine Mannschaft gespielt hat.
# nth data % > % group_by(teamID) % > % summarise(second_game = nth(yearID, 2)) % > % arrange(second_game)
Ausgang:
## # A tibble: 148 x 2 ## teamID second_game ## <fctr> <int> ## 1 BS1 1871 ## 2 CH1 1871 ## 3 FW1 1871 ## 4 NY2 1871 ## 5 RC1 1871 ## 6 BR1 1872 ## 7 BR2 1872 ## 8 CL1 1872 ## 9 MID 1872 ## 10 TRO 1872 ## # ... with 138 more rows
Eindeutige Anzahl von Beobachtungen
Die Funktion n() gibt die Anzahl der Beobachtungen in einer aktuellen Gruppe zurück. Eine geschlossene Funktion für n() ist n_distinct(), die die Anzahl der eindeutigen Werte zählt.
Im nächsten Beispiel addieren Sie die Gesamtzahl der Spieler, die eine Mannschaft in allen Zeiträumen rekrutiert hat.
# distinct values data % > % group_by(teamID) % > % summarise(number_player = n_distinct(playerID)) % > % arrange(desc(number_player))
Code Erklärung
- group_by(teamID): Gruppieren nach Jahr und Team
- zusammenfassen(Anzahl_Spieler = n_distinct(playerID)): Zählt die eindeutige Anzahl der Spieler pro Team
- array(desc(number_player)): Sortieren Sie die Daten nach der Anzahl der Spieler
Ausgang:
## # A tibble: 148 x 2 ## teamID number_player ## <fctr> <int> ## 1 CHN 751 ## 2 SLN 729 ## 3 PHI 699 ## 4 PIT 683 ## 5 CIN 679 ## 6 BOS 647 ## 7 CLE 646 ## 8 CHA 636 ## 9 DET 623 ## 10 NYA 612 ## # ... with 138 more rows
Mehrere Gruppen
Eine zusammenfassende Statistik kann über mehrere Gruppen hinweg erstellt werden.
# Multiple groups data % > % group_by(yearID, teamID) % > % summarise(mean_games = mean(G)) % > % arrange(desc(teamID, yearID))
Code Erklärung
- group_by(yearID, teamID): Nach Jahr gruppieren und Team
- summarise(mean_games = mean(G)): Fassen Sie die Anzahl der Spieler zusammen
- array(desc(teamID, yearID)): Sortieren Sie die Daten nach Team und Jahr
Ausgang:
## # A tibble: 2,829 x 3 ## # Groups: yearID [146] ## yearID teamID mean_games ## <int> <fctr> <dbl> ## 1 1884 WSU 20.41667 ## 2 1891 WS9 46.33333 ## 3 1886 WS8 22.00000 ## 4 1887 WS8 51.00000 ## 5 1888 WS8 27.00000 ## 6 1889 WS8 52.42857 ## 7 1884 WS7 8.00000 ## 8 1875 WS6 14.80000 ## 9 1873 WS5 16.62500 ## 10 1872 WS4 4.20000 ## # ... with 2,819 more rows
Filter
Bevor Sie eine Operation durchführen, können Sie den Datensatz filtern. Der Datensatz beginnt im Jahr 1871, und die Jahre vor 1980 werden für die Analyse nicht benötigt.
# Filter data % > % filter(yearID > 1980) % > % group_by(yearID) % > % summarise(mean_game_year = mean(G))
Code Erklärung
- filter(yearID > 1980): Filtern Sie die Daten, um nur die relevanten Jahre anzuzeigen (z. B. nach 1980).
- group_by(yearID): Nach Jahr gruppieren
- summarise(mean_game_year = mean(G)): Fassen Sie die Daten zusammen
Ausgang:
## # A tibble: 36 x 2 ## yearID mean_game_year ## <int> <dbl> ## 1 1981 40.64583 ## 2 1982 56.97790 ## 3 1983 60.25128 ## 4 1984 62.97436 ## 5 1985 57.82828 ## 6 1986 58.55340 ## 7 1987 48.74752 ## 8 1988 52.57282 ## 9 1989 58.16425 ## 10 1990 52.91556 ## # ... with 26 more rows
Ungroup
Zu guter Letzt müssen Sie die Gruppierung entfernen, bevor Sie die Berechnungsebene ändern möchten.
# Ungroup the data data % > % filter(HR > 0) % > % group_by(playerID) % > % summarise(average_HR_game = sum(HR) / sum(G)) % > % ungroup() % > % summarise(total_average_homerun = mean(average_HR_game))
Code Erklärung
- filter(HR >0): Null-Homerun ausschließen
- group_by(playerID): nach Spieler gruppieren
- zusammenfassen(durchschnittliche_HR_Spiel = Summe(HR)/Summe(G)): Durchschnittlichen Homerun pro Spieler berechnen
- ungroup(): Gruppierung entfernen
- summarise(total_average_homerun = mean(average_HR_game)): Fassen Sie die Daten zusammen
Ausgang:
## # A tibble: 1 x 1 ## total_average_homerun ## <dbl> ## 1 0.06882226
Zusammenfassung
Wenn Sie eine Zusammenfassung nach Gruppe zurückgeben möchten, können Sie Folgendes verwenden:
# group by X1, X2, X3 group(df, X1, X2, X3)
Sie müssen die Gruppierung der Daten aufheben mit:
ungroup(df)
Die folgende Tabelle fasst die Funktion zusammen, die Sie mit summarise() gelernt haben
Methodik | Funktion | Code |
---|---|---|
bedeuten | bedeuten |
summarise(df,mean_x1 = mean(x1)) |
mittlere | mittlere |
summarise(df,median_x1 = median(x1)) |
Summe | Summe |
summarise(df,sum_x1 = sum(x1)) |
Standardabweichung | sd |
summarise(df,sd_x1 = sd(x1)) |
Interquartil | IQR |
summarise(df,interquartile_x1 = IQR(x1)) |
Minimum | Min. |
summarise(df,minimum_x1 = min(x1)) |
maximal | max |
summarise(df,maximum_x1 = max(x1)) |
Quantil | Quantil |
summarise(df,quantile_x1 = quantile(x1)) |
erste Beobachtung | zuerst |
summarise(df,first_x1 = first(x1)) |
letzte Beobachtung | letzte |
summarise(df,last_x1 = last(x1)) |
n-te Beobachtung | nth |
summarise(df,nth_x1 = nth(x1, 2)) |
Anzahl des Vorkommens | n |
summarise(df,n_x1 = n(x1)) |
Anzahl unterschiedlicher Vorkommnisse | n_distinct |
summarise(df,n_distinct _x1 = n_distinct(x1)) |