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