R Aggregert funksjon: Summarize & Group_by() Eksempel
Oppsummering av en variabel er viktig for å ha en ide om dataene. Selv om oppsummering av en variabel etter gruppe gir bedre informasjon om fordelingen av dataene.
I denne opplæringen lærer du hvordan du oppsummerer et datasett etter gruppe med dplyr-biblioteket.
For denne opplæringen vil du bruke batting-datasettet. Det originale datasettet inneholder 102816 observasjoner og 22 variabler. Du vil bare bruke 20 prosent av dette datasettet og bruke følgende variabler:
- playerID: Spiller ID-kode. Faktor
- årID: År. Faktor
- teamID: Team. faktor
- lgID: Liga. Faktor: AA AL FL NL PL UA
- AB: På flaggermus. Numerisk
- G: Spill: antall spill av en spiller. Numerisk
- R: Løper. Numerisk
- HR: Homeruns. Numerisk
- SH: Offertreff. Numerisk
Før du utfører et sammendrag, gjør du følgende trinn for å forberede dataene:
- Trinn 1: Importer dataene
- Trinn 2: Velg de relevante variablene
- Trinn 3: Sorter dataene
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)
En god praksis når du importerer et datasett er å bruke glimpse()-funksjonen for å få en idé om strukturen til datasettet.
# Structure of the data glimpse(data)
Utgang:
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, ...
Oppsummering()
Syntaksen til summarise() er grunnleggende og konsistent med de andre verbene som er inkludert i dplyr-biblioteket.
summarise(df, variable_name=condition) arguments: - `df`: Dataset used to construct the summary statistics - `variable_name=condition`: Formula to create the new variable
Se på koden nedenfor:
summarise(data, mean_run =mean(R))
Kode Forklaring
- summarise(data, mean_run = mean(R)): Oppretter en variabel kalt mean_run som er gjennomsnittet av kolonnekjøringen fra datasettdataene.
Utgang:
## mean_run ## 1 19.20114
Du kan legge til så mange variabler du vil. Du returnerer gjennomsnittlig spilte kamper og gjennomsnittlig offertreff.
summarise(data, mean_games = mean(G), mean_SH = mean(SH, na.rm = TRUE))
Kode Forklaring
- mean_SH = mean(SH, na.rm = TRUE): Oppsummer en annen variabel. Du setter na.rm = TRUE fordi kolonnen SH inneholder manglende observasjoner.
Utgang:
## mean_games mean_SH ## 1 51.98361 2.340085
Group_by vs no group_by
Funksjonen summerise() uten group_by() gir ingen mening. Den lager sammendragsstatistikk etter gruppe. Biblioteket dplyr bruker en funksjon automatisk på gruppen du passerte inne i verbet group_by.
Legg merke til at group_by fungerer perfekt med alle de andre verbene (dvs. mutate(), filter(), arrange(), …).
Det er praktisk å bruke rørledningsoperatøren når du har mer enn ett trinn. Du kan beregne gjennomsnittlig homerun etter baseballliga.
data % > % group_by(lgID) % > % summarise(mean_run = mean(HR))
Kode Forklaring
- data: Datasett som brukes til å konstruere oppsummeringsstatistikken
- group_by(lgID): Beregn sammendraget ved å gruppere variabelen `lgID
- summarise(mean_run = mean(HR)): Beregn gjennomsnittlig homerun
Utgang:
## # 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
Røroperatøren fungerer også med ggplot(). Du kan enkelt vise oppsummeringsstatistikken med en graf. Alle trinnene skyves inne i rørledningen til grapen er plottet. Det virker mer visuelt å se den gjennomsnittlige homerun etter liga med en barrøye. Koden nedenfor demonstrerer kraften ved å kombinere group_by(), summarise() og ggplot() sammen.
Du vil gjøre følgende trinn:
- Trinn 1: Velg dataramme
- Trinn 2: Gruppedata
- Trinn 3: Oppsummer dataene
- Trinn 4: Plott sammendragsstatistikken
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()" ) )
Utgang:
Funksjon i oppsummering()
Verbet summarise() er kompatibelt med nesten alle funksjonene i R. Her er en kort liste over nyttige funksjoner du kan bruke sammen med summarise():
Målet | Funksjon | Tekniske beskrivelser |
---|---|---|
Basic | mener() | Gjennomsnitt av vektor x |
median() | Median av vektor x | |
sum() | Summen av vektor x | |
variasjon | sd() | standardavvik for vektor x |
IQR() | Interkvartil av vektor x | |
Område | min () | Minimum vektor x |
maks () | Maksimum av vektor x | |
kvantil() | Kvantil av vektor x | |
Stilling | først() | Bruk med group_by() Første observasjon av gruppen |
siste() | Bruk med group_by(). Siste observasjon av gruppen | |
nth() | Bruk med group_by(). nte observasjon av gruppen | |
Telle | n() | Bruk med group_by(). Tell antall rader |
n_distinct() | Bruk med group_by(). Tell antall distinkte observasjoner |
Vi vil se eksempler for hver funksjon i tabell 1.
Grunnleggende funksjon
I det forrige eksemplet lagret du ikke sammendragsstatistikken i en dataramme.
Du kan fortsette i to trinn for å generere en datoramme fra et sammendrag:
- Trinn 1: Lagre datarammen for videre bruk
- Trinn 2: Bruk datasettet til å lage et linjeplott
Trinn 1) Du beregner gjennomsnittlig antall spill spilt etter år.
## Mean ex1 <- data % > % group_by(yearID) % > % summarise(mean_game_year = mean(G)) head(ex1)
Kode Forklaring
- Oppsummeringsstatistikken for batting-datasettet er lagret i datarammen ex1.
Utgang:
## # 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
Trinn 2) Du viser oppsummeringsstatistikken med et linjeplott og ser trenden.
# 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" ) )
Utgang:
Underinnstilling
Funksjonen summarise() er kompatibel med delinnstilling.
## 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]))
Kode Forklaring
- median_at_bat_league_no_zero = median(AB[AB > 0]): Variabelen AB inneholder mange 0. Du kan sammenligne medianen til på bat variabel med og uten 0.
Utgang:
## # 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
En annen nyttig funksjon for å aggregere variabelen er sum().
Du kan sjekke hvilke ligaer som har flest homeruns.
## Sum data % > % group_by(lgID) % > % summarise(sum_homerun_league = sum(HR))
Utgang:
## # 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
Standardavvik
Spredningen i dataene beregnes med standardavviket eller sd() i R.
# Spread data % > % group_by(teamID) % > % summarise(sd_at_bat_league = sd(HR))
Utgang:
## # 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
Det er mye ulikhet i mengden homerun utført av hvert lag.
Minimum og maksimum
Du kan få tilgang til minimum og maksimum av en vektor med funksjonene min() og max().
Koden nedenfor returnerer det laveste og høyeste antallet kamper i en sesong spilt av en spiller.
# Min and max data % > % group_by(playerID) % > % summarise(min_G = min(G), max_G = max(G))
Utgang:
## # 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
Telle
Det er alltid en god idé å telle observasjoner etter gruppe. Med R kan du aggregere antall forekomster med n().
For eksempel beregner koden nedenfor antall år spilt av hver spiller.
# count observations data % > % group_by(playerID) % > % summarise(number_year = n()) % > % arrange(desc(number_year))
Utgang:
## # 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
Først og sist
Du kan velge den første, siste eller n'te posisjonen i en gruppe.
For eksempel kan du finne det første og siste året for hver spiller.
# first and last data % > % group_by(playerID) % > % summarise(first_appearance = first(yearID), last_appearance = last(yearID))
Utgang:
## # 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
nte observasjon
Funksjonen nth() er komplementær til first() og last(). Du kan få tilgang til den n-te observasjonen i en gruppe med indeksen som skal returneres.
Du kan for eksempel filtrere bare det andre året et lag spilte.
# nth data % > % group_by(teamID) % > % summarise(second_game = nth(yearID, 2)) % > % arrange(second_game)
Utgang:
## # 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
Distinkt antall observasjoner
Funksjonen n() returnerer antall observasjoner i en gjeldende gruppe. En lukket funksjon til n() er n_distinct(), som teller antall unike verdier.
I det neste eksemplet legger du sammen summen av spillere et lag rekrutterte i løpet av alle periodene.
# distinct values data % > % group_by(teamID) % > % summarise(number_player = n_distinct(playerID)) % > % arrange(desc(number_player))
Kode Forklaring
- group_by(teamID): Grupper etter år og lag
- summarise(nummer_spiller = n_distinkt(playerID)): Tell det distinkte antallet spillere etter lag
- arrange(desc(number_player)): Sorter dataene etter antall spillere
Utgang:
## # 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
Flere grupper
En oppsummerende statistikk kan realiseres blant flere grupper.
# Multiple groups data % > % group_by(yearID, teamID) % > % summarise(mean_games = mean(G)) % > % arrange(desc(teamID, yearID))
Kode Forklaring
- group_by(yearID, teamID): Grupper etter år og lag
- summarise(mean_games = mean(G)): Oppsummer antall spillere
- arrange(desc(teamID, yearID)): Sorter dataene etter lag og år
Utgang:
## # 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
Filtrer
Før du har tenkt å utføre en operasjon, kan du filtrere datasettet. Datasettet starter i 1871, og analysen trenger ikke årene før 1980.
# Filter data % > % filter(yearID > 1980) % > % group_by(yearID) % > % summarise(mean_game_year = mean(G))
Kode Forklaring
- filter(yearID > 1980): Filtrer dataene for å vise bare de relevante årene (dvs. etter 1980)
- group_by(yearID): Grupper etter år
- summarise(mean_game_year = mean(G)): Oppsummer dataene
Utgang:
## # 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
Del opp gruppe
Sist, men ikke minst, må du fjerne grupperingen før du vil endre nivået på beregningen.
# 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))
Kode Forklaring
- filter(HR >0): Ekskluder null homerun
- group_by(playerID): gruppe for spiller
- summarise(average_HR_game = sum(HR)/sum(G)): Beregn gjennomsnittlig homerun etter spiller
- ungroup(): fjern grupperingen
- summarise(total_average_homerun = mean(average_HR_game)): Oppsummer dataene
Utgang:
## # A tibble: 1 x 1 ## total_average_homerun ## <dbl> ## 1 0.06882226
Sammendrag
Når du vil returnere et sammendrag etter gruppe, kan du bruke:
# group by X1, X2, X3 group(df, X1, X2, X3)
du må fjerne grupperingen av dataene med:
ungroup(df)
Tabellen nedenfor oppsummerer funksjonen du lærte med summarise()
Metode | Funksjon | Kode |
---|---|---|
bety | bety |
summarise(df,mean_x1 = mean(x1)) |
median | median |
summarise(df,median_x1 = median(x1)) |
sum | sum |
summarise(df,sum_x1 = sum(x1)) |
standardavvik | sd |
summarise(df,sd_x1 = sd(x1)) |
interkvartil | I.Q.R. |
summarise(df,interquartile_x1 = IQR(x1)) |
minimum | minutter |
summarise(df,minimum_x1 = min(x1)) |
maksimal | max |
summarise(df,maximum_x1 = max(x1)) |
kvantil | kvantil |
summarise(df,quantile_x1 = quantile(x1)) |
første observasjon | først |
summarise(df,first_x1 = first(x1)) |
siste observasjon | siste |
summarise(df,last_x1 = last(x1)) |
nte observasjon | nTH |
summarise(df,nth_x1 = nth(x1, 2)) |
antall forekomster | n |
summarise(df,n_x1 = n(x1)) |
antall distinkte forekomster | n_distinkt |
summarise(df,n_distinct _x1 = n_distinct(x1)) |