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:

Group_by Eksempel med Summarize

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:

Grunnleggende funksjon Eksempel

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