R Funcția de agregare: Summarize & Group_by() Exemplu

Rezumatul unei variabile este important pentru a avea o idee despre date. Deși, rezumarea unei variabile pe grup oferă informații mai bune cu privire la distribuția datelor.

În acest tutorial, veți afla cum să rezumați un set de date pe grup cu biblioteca dplyr.

Pentru acest tutorial, veți folosi setul de date de bataie. Setul de date original conține 102816 observații și 22 de variabile. Veți folosi doar 20% din acest set de date și veți folosi următoarele variabile:

  • playerID: codul de identificare a jucătorului. Factor
  • yearID: Anul. Factor
  • teamID: Echipa. factor
  • lgID: Liga. Factor: AA AL FL NL PL UA
  • AB: La lilieci. Numeric
  • G: Jocuri: numărul de jocuri de către un jucător. Numeric
  • R: Aleargă. Numeric
  • HR: Homeruns. Numeric
  • SH: Sacrifice lovituri. Numeric

Înainte de a efectua rezumatul, veți face următorii pași pentru a pregăti datele:

  • Pasul 1: importați datele
  • Pasul 2: Selectați variabilele relevante
  • Pasul 3: Sortați datele
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)

O bună practică atunci când importați un set de date este să utilizați funcția glimpse() pentru a avea o idee despre structura setului de date.

# Structure of the data
glimpse(data)

ieșire:

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

Rezuma()

Sintaxa lui summarise() este de bază și în concordanță cu celelalte verbe incluse în biblioteca dplyr.

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

Uită-te la codul de mai jos:

summarise(data, mean_run =mean(R))

Explicarea codului

  • summarise(data, mean_run = mean(R)): creează o variabilă numită mean_run, care este media coloanei rulate din datele setului de date.

ieșire:

##   mean_run
## 1 19.20114

Puteți adăuga câte variabile doriți. Reveniți media jocurilor jucate și a loviturilor de sacrificiu.

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

Explicarea codului

  • mean_SH = mean(SH, na.rm = TRUE): Rezumați o a doua variabilă. Setați na.rm = TRUE deoarece coloana SH conține observații lipsă.

ieșire:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs nu group_by

Funcția summerise() fără group_by() nu are niciun sens. Creează statistici rezumative pe grupe. Librăria dplyr aplică automat o funcție grupului pe care l-ați trecut în verbul group_by.

Rețineți că, group_by funcționează perfect cu toate celelalte verbe (adică mutate(), filter(), arrange(), …).

Este convenabil să utilizați operatorul conductei atunci când aveți mai mult de un pas. Puteți calcula media homerun pe ligă de baseball.

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

Explicarea codului

  • date: set de date utilizat pentru a construi statisticile rezumative
  • group_by(lgID): Calculați rezumatul prin gruparea variabilei `lgID
  • summarise(mean_run = mean(HR)): Calculați media homerun

ieșire:

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

Operatorul pipe funcționează și cu ggplot(). Puteți afișa cu ușurință statistica rezumată cu un grafic. Toți pașii sunt împinși în interiorul conductei până când grap-ul este trasat. Pare mai vizual să vezi media homerun pe ligă cu o bară. Codul de mai jos demonstrează puterea combinării group_by(), summarise() și ggplot() împreună.

Veți face următorul pas:

  • Pasul 1: Selectați cadrul de date
  • Pasul 2: Grupați datele
  • Pasul 3: Rezumați datele
  • Pasul 4: Trasează statisticile rezumate
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()"
        )
    )

ieșire:

Exemplu Group_by cu Summarize

Funcția în rezumat()

Verbul summarise() este compatibil cu aproape toate funcțiile din R. Iată o listă scurtă de funcții utile pe care le puteți folosi împreună cu summarise():

Obiectiv Funcţie Descriere
pachet de bază Rău() Media vectorului x
median() Mediana vectorului x
sumă() Suma vectorului x
variație sd() abaterea standard a vectorului x
IQR() Intercuartil al vectorului x
Gamă min() Minimul vectorului x
max () Maximul vectorului x
cuantilă() Cuantila vectorului x
Poziție primul() Utilizați cu group_by() Prima observație a grupului
ultimul() Utilizați cu group_by(). Ultima observație a grupului
nth() Utilizați cu group_by(). a a-a observație a grupului
Conta n() Utilizați cu group_by(). Numărați numărul de rânduri
n_distinct() Utilizați cu group_by(). Numărați numărul de observații distincte

Vom vedea exemple pentru fiecare funcție din tabelul 1.

Functie de bază

În exemplul anterior, nu ați stocat statistica rezumată într-un cadru de date.

Puteți proceda în doi pași pentru a genera un cadru de dată dintr-un rezumat:

  • Pasul 1: Stocați cadrul de date pentru utilizare ulterioară
  • Pasul 2: Folosiți setul de date pentru a crea un grafic de linii

Pas 1) Calculați numărul mediu de jocuri jucate pe an.

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

Explicarea codului

  • Statistica rezumată a setului de date de bataie este stocată în cadrul de date ex1.

ieșire:

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

Pas 2) Afișați statistica rezumată cu un grafic de linii și vedeți tendința.

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

ieșire:

Exemplu de funcție de bază

Subsetarea

Funcția summarise() este compatibilă cu subsetarea.

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

Explicarea codului

  • median_at_bat_league_no_zero = median(AB[AB > 0]): variabila AB conține o mulțime de 0. Puteți compara mediana la bataie variabilă cu și fără 0.

ieșire:

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

O altă funcție utilă pentru agregarea variabilei este sum().

Puteți verifica care ligi au mai multe homerun-uri.

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

ieșire:

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

Deviația standard

Răspândirea datelor este calculată cu abaterea standard sau sd() în R.

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

ieșire:

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

Există o mulțime de inegalități în cantitatea de homerun făcută de fiecare echipă.

Minim si maxim

Puteți accesa minimul și maximul unui vector cu funcția min() și max().

Codul de mai jos returnează cel mai mic și cel mai mare număr de jocuri dintr-un sezon jucat de un jucător.

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

ieșire:

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

Conta

Numărarea observațiilor pe grup este întotdeauna o idee bună. Cu R, puteți agrega numărul de apariții cu n().

De exemplu, codul de mai jos calculează numărul de ani jucați de fiecare jucător.

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

ieșire:

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

Primul si ultimul

Puteți selecta prima, ultima sau a n-a poziție a unui grup.

De exemplu, puteți găsi primul și ultimul an al fiecărui jucător.

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

ieșire:

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

a a-a observație

Funcția nth() este complementară primului() și ultimul(). Puteți accesa a n-a observație în cadrul unui grup cu indexul de revenit.

De exemplu, puteți filtra doar al doilea an în care a jucat o echipă.

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

ieșire:

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

Număr distinct de observații

Funcția n() returnează numărul de observații dintr-un grup curent. O funcție închisă la n() este n_distinct(), care numără numărul de valori unice.

În exemplul următor, sumați totalul jucătorilor recrutați de o echipă în toate perioadele.

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

Explicarea codului

  • group_by(teamID): Grupați după an și echipă
  • sumar (număr_jucător = n_distinct(playerID)): numărați numărul distinct de jucători în funcție de echipă
  • arrange(desc(number_player)): Sortați datele după numărul de jucători

ieșire:

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

Grupuri multiple

O statistică rezumată poate fi realizată între mai multe grupuri.

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

Explicarea codului

  • group_by(yearID, teamID): grupare după an și echipă
  • summarise(mean_games = mean(G)): Rezumați numărul de jucători
  • arrange(desc(teamID, yearID)): Sortați datele după echipă și an

ieșire:

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

Filtru

Înainte să intenționați să efectuați o operațiune, puteți filtra setul de date. Setul de date începe în 1871, iar analiza nu are nevoie de anii anteriori anului 1980.

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

Explicarea codului

  • filter(yearID > 1980): filtrați datele pentru a afișa numai anii relevanți (adică după 1980)
  • group_by(yearID): Grupați după an
  • summarise(mean_game_year = mean(G)): Rezumați datele

ieșire:

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

Dezgrupează

Nu în ultimul rând, trebuie să eliminați gruparea înainte de a schimba nivelul de calcul.

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

Explicarea codului

  • filter(HR >0): Exclude zero homerun
  • group_by(playerID): grup după jucător
  • summarise(average_HR_game = sum(HR)/sum(G)): Calculați homerun mediu de jucător
  • ungroup(): elimina gruparea
  • summarise(total_average_homerun = mean(average_HR_game)): Rezumați datele

ieșire:

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

Rezumat

Când doriți să returnați un rezumat pe grup, puteți utiliza:

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

trebuie să degrupați datele cu:

ungroup(df)

Tabelul de mai jos rezumă funcția pe care ați învățat-o cu summarise()

Metodă Funcţie Cod
însemna însemna
summarise(df,mean_x1 = mean(x1))
mediană mediană
summarise(df,median_x1 = median(x1))
sumă sumă
summarise(df,sum_x1 = sum(x1))
deviație standard sd
summarise(df,sd_x1 = sd(x1))
intercuartil I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minim minute
summarise(df,minimum_x1 = min(x1))
maxim max
summarise(df,maximum_x1 = max(x1))
cuantilă cuantilă
summarise(df,quantile_x1 = quantile(x1))
prima observatie primul
summarise(df,first_x1 = first(x1))
ultima observatie ultimul
summarise(df,last_x1 = last(x1))
a a-a observație a n-
summarise(df,nth_x1 = nth(x1, 2))
numărul de apariție n
summarise(df,n_x1 = n(x1))
număr de apariție distinctă n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))