R Samlet funktion: Opsummer & Group_by() Eksempel

Sammenfatning af en variabel er vigtig for at have en idé om dataene. Selvom opsummering af en variabel efter gruppe giver bedre information om fordelingen af ​​dataene.

I denne øvelse lærer du, hvordan du opsummerer et datasæt efter gruppe med dplyr-biblioteket.

Til denne øvelse skal du bruge batting-datasættet. Det originale datasæt indeholder 102816 observationer og 22 variabler. Du vil kun bruge 20 procent af dette datasæt og bruge 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å flagermus. Numerisk
  • G: Spil: antal spil af en spiller. Numerisk
  • R: Løber. Numerisk
  • HR: Homeruns. Numerisk
  • SH: Offer hits. Numerisk

Før du udfører en oversigt, skal du udføre følgende trin for at forberede dataene:

  • Trin 1: Importer dataene
  • Trin 2: Vælg de relevante variable
  • Trin 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 datasæt, er at bruge glimpse()-funktionen til at få en idé om strukturen af ​​datasættet.

# Structure of the data
glimpse(data)

Output:

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

Sammenfatte()

Syntaksen for summarise() er grundlæggende og i overensstemmelse med de andre verber, der er inkluderet 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 koden nedenfor:

summarise(data, mean_run =mean(R))

Kode Forklaring

  • summarise(data, mean_run = mean(R)): Opretter en variabel ved navn mean_run, som er gennemsnittet af kolonnekørslen fra datasættets data.

Output:

##   mean_run
## 1 19.20114

Du kan tilføje så mange variabler, som du vil. Du returnerer de gennemsnitlige spillede spil og de gennemsnitlige offerhits.

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

Kode Forklaring

  • mean_SH = mean(SH, na.rm = TRUE): Opsummer en anden variabel. Du indstiller na.rm = TRUE, fordi kolonnen SH indeholder manglende observationer.

Output:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs no group_by

Funktionen summerise() uden group_by() giver ingen mening. Det skaber sammenfattende statistik efter gruppe. Biblioteket dplyr anvender automatisk en funktion på den gruppe, du passerede inde i verbet group_by.

Bemærk, at group_by fungerer perfekt sammen med alle de andre verber (dvs. mutate(), filter(), arrange(), …).

Det er praktisk at bruge rørledningsoperatøren, når du har mere end et trin. Du kan beregne den gennemsnitlige homerun efter baseball-liga.

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

Kode Forklaring

  • data: Datasæt brugt til at konstruere oversigtsstatistikken
  • group_by(lgID): Beregn oversigten ved at gruppere variablen `lgID
  • summarise(mean_run = mean(HR)): Beregn den gennemsnitlige homerun

Output:

## 
# 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 arbejder også med ggplot(). Du kan nemt vise den sammenfattende statistik med en graf. Alle trin skubbes inde i rørledningen, indtil grapen er plottet. Det virker mere visuelt at se den gennemsnitlige homerun efter liga med en bar char. Koden nedenfor demonstrerer styrken ved at kombinere group_by(), summarise() og ggplot() sammen.

Du vil gøre følgende trin:

  • Trin 1: Vælg dataramme
  • Trin 2: Grupper data
  • Trin 3: Opsummer dataene
  • Trin 4: Plot oversigtsstatistikken
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()"
        )
    )

Output:

Group_by Eksempel med Summarize

Funktion i summarise()

Verbet summarise() er kompatibelt med næsten alle funktionerne i R. Her er en kort liste over nyttige funktioner, du kan bruge sammen med summarise():

Objektiv Funktion Produktbeskrivelse
Grundlæggende betyde() Gennemsnit af vektor x
median() Medianen af ​​vektor x
sum() Summen af ​​vektor x
variation sd() standardafvigelse af vektor x
IQR() Interkvartil af vektor x
Rækkevidde min() Minimum af vektor x
max() Maksimum af vektor x
kvantil() Kvantil af vektor x
Position først() Brug med group_by() Første observation af gruppen
sidst() Brug med group_by(). Sidste observation af gruppen
n'te() Brug med group_by(). nth observation af gruppen
Tælle n () Brug med group_by(). Tæl antallet af rækker
n_distinct() Brug med group_by(). Tæl antallet af forskellige observationer

Vi vil se eksempler for hver funktion i tabel 1.

Grundlæggende funktion

I det foregående eksempel gemte du ikke oversigtsstatistikken i en dataramme.

Du kan fortsætte i to trin for at generere en datoramme ud fra en oversigt:

  • Trin 1: Gem datarammen til videre brug
  • Trin 2: Brug datasættet til at oprette et linjeplot

Trin 1) Du beregner det gennemsnitlige antal spil spillet efter år.

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

Kode Forklaring

  • Opsummeringsstatistikken for batting-datasæt er gemt i datarammen ex1.

Output:

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

Trin 2) Du viser oversigtsstatistikken med et linjeplot og ser tendensen.

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

Output:

Eksempel på grundlæggende funktion

Underindstilling

Funktionen summarise() er kompatibel med underindstilling.

## 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]): Variablen AB indeholder partier på 0. Du kan sammenligne medianen af på bat variabel med og uden 0.

Output:

## # 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 anden nyttig funktion til at aggregere variablen er sum().

Du kan tjekke, hvilke ligaer der har flest homeruns.

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

Output:

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

Standardafvigelse

Spredningen i dataene beregnes med standardafvigelsen eller sd() i R.

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

Output:

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

Der er masser af ulighed i mængden af ​​homerun udført af hvert hold.

Minimum og maksimum

Du kan få adgang til minimum og maksimum af en vektor med funktionen min() og max().

Koden nedenfor returnerer det laveste og højeste antal spil i en sæson spillet af en spiller.

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

Output:

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

Tælle

At tælle observationer efter gruppe er altid en god idé. Med R kan du aggregere antallet af forekomster med n().

For eksempel beregner koden nedenfor antallet af år spillet af hver spiller.

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

Output:

## # 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ørste og sidste

Du kan vælge den første, sidste eller n'te position i en gruppe.

For eksempel kan du finde det første og sidste år for hver spiller.

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

Output:

## # 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'te observation

Funktionen nth() er komplementær til first() og last(). Du kan få adgang til den n'te observation inden for en gruppe med indekset for at returnere.

For eksempel kan du kun filtrere det andet år, et hold spillede.

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

Output:

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

Funktionen n() returnerer antallet af observationer i en aktuel gruppe. En lukket funktion til n() er n_distinct(), som tæller antallet af unikke værdier.

I det næste eksempel summerer du det samlede antal spillere, som et hold har rekrutteret i løbet af alle perioder.

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

Kode Forklaring

  • group_by(teamID): Gruppér efter år og hold
  • summarise(nummer_spiller = n_distinct(playerID)): Tæl det distinkte antal spillere efter hold
  • arrange(desc(number_player)): Sorter data efter antallet af spillere

Output:

## # 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 opsummerende statistik kan realiseres blandt flere grupper.

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

Kode Forklaring

  • group_by(yearID, teamID): Gruppér efter år og hold
  • summarise(mean_games = mean(G)): Opsummer antallet af spillere
  • arrange(desc(teamID, yearID)): Sorter data efter hold og år

Output:

## # 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 til hensigt at udføre en handling, kan du filtrere datasættet. Datasættet starter i 1871, og analysen behøver 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 kun at vise de relevante år (dvs. efter 1980)
  • group_by(yearID): Gruppér efter år
  • summarise(mean_game_year = mean(G)): Opsummer dataene

Output:

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

Opdel gruppe

Sidst, men ikke mindst, skal du fjerne grupperingen, før du vil ændre niveauet for 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 nul homerun
  • group_by(playerID): gruppe for spiller
  • summarise(average_HR_game = sum(HR)/sum(G)): Beregn gennemsnitlig homerun efter spiller
  • ungroup(): fjern grupperingen
  • summarise(total_average_homerun = mean(average_HR_game)): Opsummer dataene

Output:

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

Resumé

Når du vil returnere et resumé efter gruppe, kan du bruge:

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

du skal ophæve grupperingen af ​​dataene med:

ungroup(df)

Tabellen nedenfor opsummerer den funktion, du lærte med summarise()

Metode Funktion Kode
betyde betyde
summarise(df,mean_x1 = mean(x1))
median median
summarise(df,median_x1 = median(x1))
sum sum
summarise(df,sum_x1 = sum(x1))
standardafvigelse sd
summarise(df,sd_x1 = sd(x1))
interkvartil I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minimum minut
summarise(df,minimum_x1 = min(x1))
maksimal max
summarise(df,maximum_x1 = max(x1))
kvantil kvantil
summarise(df,quantile_x1 = quantile(x1))
første observation første
summarise(df,first_x1 = first(x1))
sidste observation sidste
summarise(df,last_x1 = last(x1))
n'te observation n'te
summarise(df,nth_x1 = nth(x1, 2))
antal forekomster n
summarise(df,n_x1 = n(x1))
antal forskellige forekomster n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))