R koondfunktsioon: summarize() ja group_by() näide
⚡ Nutikas kokkuvõte
R-i koondfunktsioon koos funktsiooniga dplyr koondab mitu rida üheks statistiliseks näitajaks iga rühma kohta. See õpetus seob group_by() funktsiooni summarize() funktsiooniga Lahmani löögiandmete põhjal, et arvutada 104 324 vaatluse keskmisi, summasid, levikuid, loendeid ja positsiooniväärtusi.

Selles õpetuses kasutatud andmestik
Muutuja summeerimine annab esmase ettekujutuse andmetest ja rühmade kaupa kokkuvõtete tegemine annab palju rohkem teavet väärtuste jaotuse kohta. See õpetus näitab, kuidas andmestikku rühmade kaupa dplyr teegi abil koondada.
See õpetus kasutab Lahmani löömismängu andmestikku. Pärast selle importimist ja hoidmistping Ainult allpool loetletud üheksa veergu sisaldab tööandmeraamistik 104 324 vaatlust ja 9 muutujat:
- mängija ID: mängija ID kood. tegur
- aasta ID: Aasta. tegur
- meeskonna ID: meeskond. tegur
- lgID: Liiga. Tegur: AA AL FL NL PL UA
- AB: Nahkhiirte juures. Numbriline
- G: Mängud: mängija mängude arv. Numbriline
- R: Jookseb. Numbriline
- HR: Homeruns. Numbriline
- SH: ohverdatavad hitid. Numbriline
Enne kokkuvõtte tegemist teete andmete ettevalmistamiseks järgmised sammud.
- 1. toiming: importige andmed
- 2. samm: valige asjakohased muutujad
- 3. samm: sortige andmed
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)
Andmestiku importimisel on hea tava kasutada funktsiooni glimpse(), et saada ülevaade andmestiku struktuurist.
# Structure of the data glimpse(data)
Väljund:
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, ...
kokkuvõte()
Funktsiooni summarise() süntaks on põhiline ja kooskõlas teiste dplyr teegis sisalduvate tegusõnadega.
summarise(df, variable_name=condition) arguments: - `df`: Dataset used to construct the summary statistics - `variable_name=condition`: Formula to create the new variable
Vaadake allolevat koodi:
summarise(data, mean_run =mean(R))
Code Selgitus
- summarise(data, mean_run = mean(R)): loob muutuja nimega mean_run, mis on andmestiku andmetest käivitatud veeru keskmine.
Väljund:
## mean_run ## 1 19.20114
Saate lisada nii palju muutujaid, kui soovite. Tagastate keskmised mängitud mängud ja keskmised ohverdatavad tabamused.
summarise(data, mean_games = mean(G), mean_SH = mean(SH, na.rm = TRUE))
Code Selgitus
- keskmine_SH = keskmine (SH, na.rm = TRUE): võtke kokku teine muutuja. Määrasite väärtuse na.rm = TRUE, kuna veerg SH sisaldab puuduvaid vaatlusi.
Väljund:
## mean_games mean_SH ## 1 51.98361 2.340085
group_by() vs ilma group_by() funktsioonita
Nagu ülaltoodud näited näitavad, ahendab summarize() kogu andmeraami üheks reaks. Selle tegelik võimsus ilmneb pärast group_by() lisamist: the dplyr Seejärel rakendab teek sama arvutuse igale rühmale eraldi ja tagastab ühe rea rühma kohta.
Pange tähele, et group_by töötab suurepäraselt kõigi teiste tegusõnadega (st mute(), filter(), arrange(), …).
Torujuhtme operaatorit on mugav kasutada, kui teil on rohkem kui üks samm. Saate arvutada keskmise homeruni pesapalliliiga järgi.
data %>% group_by(lgID) %>% summarise(mean_run = mean(HR))
Code Selgitus
- andmed: kokkuvõtliku statistika koostamiseks kasutatav andmestik
- group_by(lgID): Jagab andmed lgID väärtuste järgi enne kokkuvõtet
- summarise(mean_run = keskmine(HR)): Arvutage keskmine homerun
Väljund:
## # 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
See toru töötab ka funktsiooniga ggplot(), seega kogu ahel toorandmetest kuni lõpliku diagrammini jääb ühte lausesse. Allolev kood ühendab funktsioonid group_by(), summarize() ja ggplot(), et kuvada tulpdiagrammil keskmist kodujooksude arvu liigas.
Teete järgmise sammu:
- 1. samm: valige andmeraam
- 2. samm: rühmitage andmed
- 3. samm: tehke andmetest kokkuvõte
- 4. samm: koostage kokkuvõtlik statistika
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()" ) )
Väljund:
Funktsioonid, mida saate summarize() sees kasutada
Tegusõna summarise() ühildub peaaegu kõigi R-i funktsioonidega. Siin on lühike nimekiri kasulikest funktsioonidest, mida saate koos funktsiooniga summarise() kasutada:
| Eesmärk | funktsioon | Kirjeldus |
|---|---|---|
| Põhi- | tähendab () | Vektori x keskmine |
| mediaan() | Vektori x mediaan | |
| summa() | Vektori x summa | |
| variatsioon | sd() | vektori x standardhälve |
| IQR() | Vektori x interkvartiil | |
| Valik | min() | Vektori x miinimum |
| max() | Vektori x maksimum | |
| kvantiil() | Vektori x kvantiil | |
| ASUKOHT | esimene () | Kasuta koos group_by()-ga Rühma esimene vaatlus |
| viimane () | Kasutage koos group_by(). Rühma viimane tähelepanek | |
| nth() | Kasutage koos group_by(). rühma n-s vaatlus | |
| Loendama | n() | Kasutage koos group_by(). Loendage ridade arv |
| n_distinct() | Kasutage koos group_by(). Loendage erinevate vaatluste arv |
Allolevates osades on toodud näide iga ülaltoodud tabelis oleva funktsiooni kohta. Kui toru ja teised verbid on teile uued, alustage järgmisest: vali, filtreeri ja korralda õpetust.
Põhifunktsioon
Eelmises näites ei salvestanud te kokkuvõtvat statistikat andmeraami.
Andmeraami saab kokkuvõttest genereerida kahes etapis:
- 1. samm: salvestage andmeraam edasiseks kasutamiseks
- 2. samm: kasutage joondiagrammi loomiseks andmestikku
Step 1) Arvutate aasta keskmise mängitud mängude arvu.
## Mean ex1 <- data %>% group_by(yearID) %>% summarise(mean_game_year = mean(G)) head(ex1)
Code Selgitus
- Löögiandmestiku kokkuvõtlik statistika salvestatakse andmeraami ex1.
Väljund:
## # 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
Step 2) Näitate kokkuvõtvat statistikat joondiagrammiga ja näete trendi.
# 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" ) )
Väljund:
Alamhulk
Funktsioon summarise() ühildub alamhulgaga.
## 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 Selgitus
- mediaan_at_bat_league_no_zero = mediaan(AB[AB > 0]): muutuja AB sisaldab palju 0. Saate võrrelda juures nahkhiir muutuja 0-ga ja ilma.
Väljund:
## # 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
Summa
Teine kasulik funktsioon muutuja koondamiseks on summa().
Saate kontrollida, millistel liigadel on rohkem homeruni.
## Sum data %>% group_by(lgID) %>% summarise(sum_homerun_league = sum(HR))
Väljund:
## # 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
Standardhälve
Andmete jaotus arvutatakse standardhälbe või sd() abil R-s.
# Spread data %>% group_by(teamID) %>% summarise(sd_at_bat_league = sd(HR))
Väljund:
## # 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
Kodulöökide arvu jaotus on meeskondade vahel väga erinev ja ALT tagastab väärtuse NA, kuna sellel meeskonnal on ainult üks rida, seega ei saa standardhälvet arvutada.
Miinimum ja maksimum
Funktsioonidega min() ja max() pääsete ligi vektori miinimumile ja maksimumile.
Allolev kood tagastab väikseima ja suurima mängude arvu mängija mängitud hooajal.
# Min and max data %>% group_by(playerID) %>% summarise(min_G = min(G), max_G = max(G))
Väljund:
## # 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
Loendama
Vaatluste loendamine rühmade kaupa on alati väärt tegemist. R-is tagastab n() ridade arvu praeguses rühmas.
Näiteks arvutab allolev kood iga mängija mängitud aastate arvu.
# count observations data %>% group_by(playerID) %>% summarise(number_year = n()) %>% arrange(desc(number_year))
Väljund:
## # 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
Esimene ja viimane
Saate valida rühma esimese, viimase või n-nda positsiooni.
Näiteks leiate iga mängija esimese ja viimase aasta.
# first and last data %>% group_by(playerID) %>% summarise(first_appearance = first(yearID), last_appearance = last(yearID))
Väljund:
## # 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-s tähelepanek
Funktsioon nth() täiendab funktsioone first() ja last(). See tagastab iga rühma sees edastatud indeksi juures oleva vaatluse.
Näiteks saate filtreerida ainult teise aasta, mil meeskond mängis.
# nth data %>% group_by(teamID) %>% summarise(second_game = nth(yearID, 2)) %>% arrange(second_game)
Väljund:
## # 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
Eristuv arv vaatlusi
n() tagastab ridade arvu praeguses rühmas. Seotud n_distinct() loendab hoopis unikaalseid väärtusi.
Järgmises näites liidate kokku mängijate koguarv, kelle meeskond kõigi perioodide jooksul värvas.
# distinct values data %>% group_by(teamID) %>% summarise(number_player = n_distinct(playerID)) %>% arrange(desc(number_player))
Code Selgitus
- group_by(teamID): Grupeeri meeskonna järgi
- summarise(number_player = n_eristav(mängijaID)): Loendage meeskonnas erinevad mängijad
- arrange(desc(number_player)): sorteeri andmed mängijate arvu järgi
Väljund:
## # 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
Mitu rühma
Kokkuvõtvat statistikat saab teha mitme rühma kohta.
# Multiple groups data %>% group_by(yearID, teamID) %>% summarise(mean_games = mean(G)) %>% arrange(desc(teamID, yearID))
Code Selgitus
- group_by(yearID, teamID): rühmitamine aasta järgi ja meeskond
- summarize(mean_games = mean(G)): Keskmine mängitud mängude arv
- arrange(desc(teamID, yearID)): Sorteeri andmed meeskonna ja aasta järgi
Väljund:
## # 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
filtrid
Enne toimingu tegemist saate andmestiku filtreerida. Andmekogum algab 1871. aastast ja analüüs ei vaja 1980. aastale eelnevaid aastaid.
# Filter data %>% filter(yearID > 1980) %>% group_by(yearID) %>% summarise(mean_game_year = mean(G))
Code Selgitus
- filter(yearID > 1980): filtreerige andmed, et kuvada ainult asjakohased aastad (st pärast 1980. aastat)
- group_by(yearID): rühmita aasta järgi
- summarise(mean_game_year = keskmine(G)): Tehke andmete kokkuvõte
Väljund:
## # 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
Lõhu
Lõpuks peate eemaldama mullaping enne arvutuse käivitamise taseme muutmist. Ilma ungroup() funktsioonita töötaks teine summarize() ikkagi iga mängija kohta eraldi.
# 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 Selgitus
- filter(HR >0) : välista null homerun
- group_by(playerID): rühm mängija järgi
- summarise(average_HR_game = summa(HR)/sum(G)): Arvutage mängija keskmine kodujooksu
- ungroup(): eemalda rühmping
- summarise(total_average_homerun = mean(average_HR_game)): Tehke andmete kokkuvõte
Väljund:
## # A tibble: 1 x 1 ## total_average_homerun ## <dbl> ## 1 0.06882226
Kuidas across() abil mitut veergu kokku võtta
Iga ülaltoodud näide nimetab korraga ühe veeru. Kui sama statistikat on vaja paljude veergude jaoks, rakendab across() seda kõigile ühe kutse käigus.
# One function, several columns data %>% group_by(lgID) %>% summarise(across(c(R, HR, G), mean, .names = "mean_{.col}")) # Every numeric column at once data %>% group_by(lgID) %>% summarise(across(where(is.numeric), mean, na.rm = TRUE)) # Several functions applied to several columns data %>% group_by(teamID) %>% summarise(across(c(R, HR), list(avg = mean, total = sum)))
Käitumist kontrollivad kolm argumenti:
- .cols: veerud, millega tegutseda, kirjutatud samade abimeestega nagu select(), sealhulgas where(is.numeric).
- .fns-failid: üks funktsioon või nimetatud funktsioonide loend, mida igale veerule rakendada.
- .nimed: väljundi nimetamise muster, kus {.col} on veerg ja {.fn} funktsiooni nimi.
across() asendas dplyr 1.0.0 versioonis vanemad abimehed summarize_all(), summarize_at() ja summarize_if(). Need töötavad endiselt, kuid on asendatud, seega peaks uus kood kasutama across() funktsiooni.
Levinumad summarize() vead ja kuidas neid parandada
Enamiku ebaõnnestunud agregatsioonide põhjusteks on neli probleemi.
- Tulemuseks on NA. mean() ja sum() tagastavad väärtuse NA, kui mõni väärtus puudub. Lisa na.rm = TRUE, nagu ülaltoodud mean_SH näites.
- Sõnum „summarise() väljund on rühmitatud”. Grouping Kahe muutuja järgi grupeerimine jätab tulemuse esimese järgi grupeerituks. Grupi eemaldamiseks sisesta .groups = “drop”.pingvõi kutsu pärast välja funktsioon ungroup().
- Hilisem arvutus annab vale taseme. Andmeraam jääb grupeerituks kuni selle grupeerimise tühistamiseni, seega iga grupi kohta käivitatakse ikkagi teine summarize() funktsioon. Täpselt seda demonstreeribki ungroup() näide.
- Väljund sisaldab oodatust rohkem ridu. summarize() tagastab ühe rea rühma kohta, seega tahtmatu rühmping muutuja korrutab väljundi. Kontrollige iga tibble'i kohal olevat rida „Groups:”.
# Drop the grouping as part of the call data %>% group_by(yearID, teamID) %>% summarise(mean_games = mean(G), .groups = "drop")
summarize() R-is: funktsioonide juhend
Kokkuvõtte tagastamiseks rühmade kaupa jagage andmed kõigepealt:
# group by X1, X2, X3 group_by(df, X1, X2, X3)
ja eemaldage muldping kui arvutuse tase muutub:
ungroup(df)
Allolev tabel loetleb kõik selles õpetuses summarize() funktsiooniga kasutatud funktsioonid:
| Meetod | funktsioon | Code |
|---|---|---|
| keskmine | keskmine |
summarise(df, mean_x1 = mean(x1))
|
| mediaan | mediaan |
summarise(df, median_x1 = median(x1)) |
| summa | summa |
summarise(df, sum_x1 = sum(x1))
|
| standardhälve | sd |
summarise(df, sd_x1 = sd(x1)) |
| interkvartiil | I.Q.R. |
summarise(df, interquartile_x1 = IQR(x1)) |
| miinimum | minutit |
summarise(df, minimum_x1 = min(x1)) |
| maksimaalne | max |
summarise(df, maximum_x1 = max(x1))
|
| kvantiil | kvantiil |
summarise(df, quantile_x1 = quantile(x1, probs = 0.75))
|
| esimene tähelepanek | esimene |
summarise(df, first_x1 = first(x1)) |
| viimane tähelepanek | viimane |
summarise(df, last_x1 = last(x1)) |
| n-s tähelepanek | n |
summarise(df, nth_x1 = nth(x1, 2)) |
| esinemise arv | n |
summarise(df, n_x1 = n()) |
| eristavate esinemiste arv | n_eristav |
summarise(df, n_distinct_x1 = n_distinct(x1)) |


