Funkcja agregująca R: przykład sumowania i grupowania według()

Podsumowanie zmiennej jest ważne, aby mieć pojęcie o danych. Chociaż podsumowanie zmiennej według grupy daje lepsze informacje o dystrybucji danych.

W tym samouczku dowiesz się, jak podsumować zbiór danych według grup za pomocą biblioteki dplyr.

W tym samouczku użyjesz zestawu danych batting. Oryginalny zestaw danych zawiera 102816 obserwacji i 22 zmienne. Użyjesz tylko 20 procent tego zestawu danych i następujących zmiennych:

  • playerID: Kod identyfikacyjny gracza. Czynnik
  • ID roku: Rok. Czynnik
  • ID zespołu: Zespół. czynnik
  • lgID: Liga. Czynnik: AA AL FL NL PL UA
  • AB: U nietoperzy. Numeryczny
  • G: Gry: liczba gier rozegranych przez gracza. Numeryczny
  • R: Biegnie. Numeryczny
  • HR: Homeruny. Numeryczny
  • SH: Ofiarne uderzenia. Numeryczny

Zanim wykonasz podsumowanie, wykonaj następujące czynności w celu przygotowania danych:

  • Krok 1: Zaimportuj dane
  • Krok 2: Wybierz odpowiednie zmienne
  • Krok 3: Posortuj dane
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)

Dobrą praktyką podczas importowania zbioru danych jest użycie funkcji przebłysk(), aby zorientować się w strukturze zbioru danych.

# Structure of the data
glimpse(data)

Wyjście:

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

Streszczać()

Składnia funkcji summarise() jest podstawowa i zgodna z pozostałymi czasownikami zawartymi w bibliotece dplyr.

summarise(df, variable_name=condition) 
arguments: 
- `df`: Dataset used to construct the summary statistics 
- `variable_name=condition`: Formula to create the new variable

Spójrz na poniższy kod:

summarise(data, mean_run =mean(R))

Objaśnienie kodu

  • summarise(data, mean_run = mean(R)): Tworzy zmienną o nazwie mean_run, która jest średnią kolumny uruchomionej na podstawie danych zestawu danych.

Wyjście:

##   mean_run
## 1 19.20114

Możesz dodać tyle zmiennych, ile chcesz. Zwracasz średnią liczbę rozegranych gier i średnią liczbę trafień poświęceń.

summarise(data, mean_games = mean(G),
    mean_SH = mean(SH, na.rm = TRUE))

Objaśnienie kodu

  • mean_SH = mean(SH, na.rm = TRUE): Podsumuj drugą zmienną. Ustawiasz na.rm = TRUE, ponieważ kolumna SH zawiera brakujące obserwacje.

Wyjście:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs brak group_by

Funkcja Summerise() bez group_by() nie ma żadnego sensu. Tworzy statystyki podsumowujące według grup. Biblioteka dplyr automatycznie stosuje funkcję do grupy przekazanej w czasowniku group_by.

Zauważ, że group_by doskonale współpracuje ze wszystkimi innymi czasownikami (tj. mutate(), filter(), aranżuj(),…).

Wygodnie jest używać operatora pipeline, gdy masz więcej niż jeden krok. Możesz obliczyć średnią liczbę homerunów według ligi baseballowej.

data % > %
	group_by(lgID) % > %
	summarise(mean_run = mean(HR))

Objaśnienie kodu

  • dane: Zbiór danych używany do konstruowania statystyk podsumowujących
  • group_by(lgID): Oblicz podsumowanie, grupując zmienną `lgID
  • summarise(mean_run = mean(HR)): Oblicz średnią liczbę homerunów

Wyjście:

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

Operator potoku działa również z ggplot(). Możesz łatwo pokazać statystykę podsumowującą za pomocą wykresu. Wszystkie kroki są umieszczane w potoku, dopóki wykres nie zostanie wykreślony. Bardziej wizualnie wydaje się zobaczenie średniego home runa według ligi za pomocą znaku słupkowego. Poniższy kod pokazuje moc łączenia group_by(), summarise() i ggplot().

Wykonaj następujący krok:

  • Krok 1: Wybierz ramkę danych
  • Krok 2: Dane grupowe
  • Krok 3: Podsumowanie danych
  • Krok 4: Wykreśl statystyki podsumowujące
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()"
        )
    )

Wyjście:

Przykład Group_by z podsumowaniem

Funkcja w summarise()

Czasownik summarise() jest zgodny z niemal wszystkimi funkcjami w R. Oto krótka lista przydatnych funkcji, których można używać razem z summarise():

Cel Funkcjonować Opis
Basic oznaczać() Średnia wektora x
mediana() Mediana wektora x
suma() Suma wektora x
zmienność SD() odchylenie standardowe wektora x
IQR() Międzykwartyl wektora x
łodzie min () Minimum wektora x
max () Maksimum wektora x
kwantyl() Kwantyl wektora x
Stanowisko Pierwszy() Użyj z group_by() Pierwsza obserwacja grupy
ostatni() Używaj z group_by(). Ostatnia obserwacja grupy
n-te() Używaj z group_by(). n-ta obserwacja grupy
Liczyć n () Używaj z group_by(). Policz liczbę rzędów
n_distinct() Używaj z group_by(). Policz liczbę różnych obserwacji

Zobaczymy przykłady dla każdej funkcji z tabeli 1.

Podstawowa funkcja

W poprzednim przykładzie statystyka podsumowująca nie została zapisana w ramce danych.

Aby wygenerować ramkę daty z podsumowania, możesz postępować w dwóch krokach:

  • Krok 1: Zapisz ramkę danych do dalszego wykorzystania
  • Krok 2: Użyj zbioru danych, aby utworzyć wykres liniowy

Krok 1) Obliczasz średnią liczbę rozegranych meczów w danym roku.

## Mean
ex1 <- data % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))
head(ex1)

Objaśnienie kodu

  • Statystyka podsumowująca zbiór danych dotyczących mrugnięcia jest przechowywana w ramce danych ex1.

Wyjście:

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

Krok 2) Pokazujesz statystykę podsumowującą w postaci wykresu liniowego i widzisz 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"
        )
    )

Wyjście:

Przykład funkcji podstawowej

Podzbiór

Funkcja summarise() jest zgodna z podzbiorem.

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

Objaśnienie kodu

  • median_at_bat_league_no_zero = mediana(AB[AB > 0]): Zmienna AB zawiera wiele zer. Możesz porównać medianę w bat zmienna z i bez 0.

Wyjście:

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

Suma

Inną przydatną funkcją do agregowania zmiennej jest sum().

Możesz sprawdzić, które ligi mają więcej homerunów.

## Sum
data % > %
	group_by(lgID) % > %
	summarise(sum_homerun_league = sum(HR))

Wyjście:

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

Odchylenie standardowe

Rozrzut danych jest obliczany za pomocą odchylenia standardowego lub sd() w R.

# Spread
data % > %
	group_by(teamID) % > %
	summarise(sd_at_bat_league = sd(HR))

Wyjście:

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

Istnieje wiele nierówności w liczbie homerunów wykonanych przez każdą drużynę.

Minimalne i maksymalne

Dostęp do minimum i maksimum wektora można uzyskać za pomocą funkcji min() i max().

Poniższy kod zwraca najniższą i najwyższą liczbę meczów w sezonie rozegranych przez danego zawodnika.

# Min and max
data % > %
	group_by(playerID) % > %
	summarise(min_G = min(G),
    max_G = max(G))

Wyjście:

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

Liczyć

Liczenie obserwacji według grup jest zawsze dobrym pomysłem. Za pomocą R możesz agregować liczbę wystąpień za pomocą n().

Na przykład poniższy kod oblicza liczbę lat gry każdego gracza.

# count observations
data % > %
	group_by(playerID) % > %
	summarise(number_year = n()) % > %
	arrange(desc(number_year))

Wyjście:

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

Pierwszy i ostatni

Można wybrać pierwszą, ostatnią lub n-tą pozycję grupy.

Na przykład możesz znaleźć pierwszy i ostatni rok każdego gracza.

# first and last
data % > %
	group_by(playerID) % > %
	summarise(first_appearance = first(yearID),
		last_appearance = last(yearID))

Wyjście:

## # 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-ta obserwacja

Funkcja nth() jest uzupełnieniem funkcji First() i Last(). Możesz uzyskać dostęp do n-tej obserwacji w grupie z indeksem, który ma zostać zwrócony.

Możesz na przykład filtrować tylko drugi rok, w którym grała dana drużyna.

# nth
data % > %
	group_by(teamID) % > %
	summarise(second_game = nth(yearID, 2)) % > %
	arrange(second_game)

Wyjście:

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

Wyraźna liczba obserwacji

Funkcja n() zwraca liczbę obserwacji w bieżącej grupie. Zamkniętą funkcją n() jest n_distinct(), która zlicza liczbę unikalnych wartości.

W następnym przykładzie sumujesz całkowitą liczbę graczy, których zespół zrekrutował we wszystkich okresach.

# distinct values
data % > %
	group_by(teamID) % > %
	summarise(number_player = n_distinct(playerID)) % > %
	arrange(desc(number_player))

Objaśnienie kodu

  • group_by(teamID): Grupa według roku i Zespół
  • podsumuj(liczba_graczy = n_odrębny(playerID)): Policz określoną liczbę graczy w drużynie
  • aranżuj(desc(number_player)): Sortuj dane według liczby graczy

Wyjście:

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

Wiele grup

Statystyka podsumowująca może być realizowana pomiędzy wieloma grupami.

# Multiple groups
data % > %
	group_by(yearID, teamID) % > %
	summarise(mean_games = mean(G)) % > %
	arrange(desc(teamID, yearID))

Objaśnienie kodu

  • group_by(yearID, teamID): Grupa według roku i Zespół
  • summarise(mean_games = mean(G)): Podsumuj liczbę graczy w grze
  • aranżuj(desc(IDzespołu, ID roku)): Sortuj dane według zespołu i roku

Wyjście:

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

FILTRY

Zanim zamierzasz wykonać operację, możesz przefiltrować zbiór danych. Zbiór danych zaczyna się w 1871 r., a analiza nie wymaga lat sprzed 1980 r.

# Filter
data % > %
	filter(yearID > 1980) % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))

Objaśnienie kodu

  • filter(yearID > 1980): Filtruj dane, aby wyświetlić tylko odpowiednie lata (tj. po 1980 r.)
  • group_by(yearID): Grupa według roku
  • summarise(mean_game_year = mean(G)): Podsumuj dane

Wyjście:

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

Rozgrupuj

Na koniec należy usunąć grupowanie, zanim będzie można zmienić poziom obliczeń.

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

Objaśnienie kodu

  • filter(HR >0): Wyklucz zerowy homerun
  • group_by(playerID): grupa według gracza
  • summarise(average_HR_game = sum(HR)/sum(G)): Oblicz średnią liczbę homerunów dla każdego gracza
  • ungroup(): usuń grupowanie
  • summarise(total_average_homerun = mean(average_HR_game)): Podsumuj dane

Wyjście:

## # A tibble: 1 x 1
##   total_average_homerun
##                   <dbl>
## 1            0.06882226	

Podsumowanie

Jeśli chcesz zwrócić podsumowanie według grup, możesz użyć:

# group by X1, X2, X3
group(df, X1, X2, X3)

musisz rozgrupować dane za pomocą:

ungroup(df)

Poniższa tabela podsumowuje funkcję, której nauczyłeś się za pomocą summarise()

Metoda wykonania Funkcjonować Code
oznaczać oznaczać
summarise(df,mean_x1 = mean(x1))
mediana mediana
summarise(df,median_x1 = median(x1))
suma suma
summarise(df,sum_x1 = sum(x1))
odchylenie standardowe sd
summarise(df,sd_x1 = sd(x1))
międzykwartyl IQR
summarise(df,interquartile_x1 = IQR(x1))
minimum min
summarise(df,minimum_x1 = min(x1))
maksymalny max
summarise(df,maximum_x1 = max(x1))
kwantyl kwantyl
summarise(df,quantile_x1 = quantile(x1))
pierwsza obserwacja drugim
summarise(df,first_x1 = first(x1))
ostatnia obserwacja trwać
summarise(df,last_x1 = last(x1))
n-ta obserwacja n-ty
summarise(df,nth_x1 = nth(x1, 2))
liczba wystąpień n
summarise(df,n_x1 = n(x1))
liczba odrębnych zdarzeń n_odrębny
summarise(df,n_distinct _x1 = n_distinct(x1))