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:

Group_by Beispiel mit Summarise

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:

Beispiel für eine Grundfunktion

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