R Aggregatfunktion: Summarize & Group_by() Exempel

Sammanfattning av en variabel är viktig för att ha en uppfattning om data. Men att sammanfatta en variabel per grupp ger bättre information om fördelningen av data.

I den här handledningen kommer du att lära dig hur du sammanfattar en datauppsättning efter grupp med dplyr-biblioteket.

För den här handledningen kommer du att använda batting-datasetet. Den ursprungliga datamängden innehåller 102816 observationer och 22 variabler. Du kommer bara att använda 20 procent av denna datauppsättning och använda följande variabler:

  • playerID: Spelar-ID-kod. Faktor
  • yearID: Year. Faktor
  • teamID: Team. faktor
  • lgID: Liga. Faktor: AA AL FL NL PL UA
  • AB: Vid fladdermöss. Numerisk
  • G: Spel: antal spel av en spelare. Numerisk
  • R: Springer. Numerisk
  • HR: Homeruns. Numerisk
  • SH: Offerträffar. Numerisk

Innan du gör en sammanfattning kommer du att göra följande steg för att förbereda data:

  • Steg 1: Importera data
  • Steg 2: Välj relevanta variabler
  • Steg 3: Sortera data
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 bra praxis när du importerar en datamängd är att använda funktionen glimpse() för att få en uppfattning om strukturen för datamängden.

# Structure of the data
glimpse(data)

Produktion:

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

Sammanfattning()

Syntaxen för summarise() är grundläggande och överensstämmer med de andra verben som ingår 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

Titta på koden nedan:

summarise(data, mean_run =mean(R))

Kodförklaring

  • summarise(data, mean_run = mean(R)): Skapar en variabel med namnet mean_run som är medelvärdet av kolumnkörningen från datauppsättningsdata.

Produktion:

##   mean_run
## 1 19.20114

Du kan lägga till så många variabler du vill. Du returnerar de genomsnittliga spelade spelen och de genomsnittliga offerträffarna.

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

Kodförklaring

  • mean_SH = mean(SH, na.rm = TRUE): Sammanfatta en andra variabel. Du ställer in na.rm = TRUE eftersom kolumnen SH innehåller saknade observationer.

Produktion:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs no group_by

Funktionen summerise() utan group_by() har ingen mening. Det skapar sammanfattande statistik per grupp. Biblioteket dplyr tillämpar en funktion automatiskt på gruppen du passerade i verbet group_by.

Observera att group_by fungerar perfekt med alla andra verb (dvs mutate(), filter(), arrange(), …).

Det är bekvämt att använda pipeline-operatören när du har mer än ett steg. Du kan beräkna den genomsnittliga homerun efter baseballliga.

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

Kodförklaring

  • data: Datauppsättning som används för att konstruera sammanfattande statistik
  • group_by(lgID): Beräkna sammanfattningen genom att gruppera variabeln `lgID
  • summarise(mean_run = mean(HR)): Beräkna den genomsnittliga homerun

Produktion:

## 
# 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 fungerar också med ggplot(). Du kan enkelt visa den sammanfattande statistiken med en graf. Alla steg skjuts in i rörledningen tills grafen är plottad. Det verkar mer visuellt att se den genomsnittliga homerun för liga med en barröding. Koden nedan visar kraften i att kombinera group_by(), summarise() och ggplot() tillsammans.

Du kommer att göra följande steg:

  • Steg 1: Välj dataram
  • Steg 2: Gruppera data
  • Steg 3: Sammanfatta data
  • Steg 4: Rita sammanfattande statistik
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()"
        )
    )

Produktion:

Group_by Exempel med Summarize

Funktion i sammanfattning()

Verbet summarise() är kompatibelt med nästan alla funktioner i R. Här är en kort lista med användbara funktioner som du kan använda tillsammans med summarise():

Mål Funktion BESKRIVNING
Grundläggande betyda() Genomsnitt av vektor x
median() Median för vektor x
belopp() Summan av vektor x
Variationen sd() standardavvikelse för vektor x
IQR() Interkvartil av vektor x
Mätområde min () Minimum av vektor x
max () Maximalt vektor x
quantile() Kvantil av vektor x
Placera först() Använd med group_by() Första observationen av gruppen
sista() Använd med group_by(). Sista observationen av gruppen
nth() Använd med group_by(). n:e observationen av gruppen
Att Räkna n () Använd med group_by(). Räkna antalet rader
n_distinct() Använd med group_by(). Räkna antalet distinkta observationer

Vi kommer att se exempel för alla funktioner i tabell 1.

Grundläggande funktion

I det föregående exemplet lagrade du inte sammanfattningsstatistiken i en dataram.

Du kan fortsätta i två steg för att generera en datumram från en sammanfattning:

  • Steg 1: Lagra dataramen för vidare användning
  • Steg 2: Använd datauppsättningen för att skapa ett linjediagram

Steg 1) Du beräknar det genomsnittliga antalet spel som spelas per år.

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

Kodförklaring

  • Sammanfattningsstatistiken för battingdataset lagras i dataramen ex1.

Produktion:

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

Steg 2) Du visar den sammanfattande statistiken med ett linjediagram och 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"
        )
    )

Produktion:

Exempel på grundläggande funktion

Underinställning

Funktionen summarise() är kompatibel med delinställning.

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

Kodförklaring

  • median_at_bat_league_no_zero = median(AB[AB > 0]): Variabeln AB innehåller massor av 0. Du kan jämföra medianen för vid bat variabel med och utan 0.

Produktion:

## # 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 annan användbar funktion för att aggregera variabeln är sum().

Du kan kolla vilka ligor som har flest homeruns.

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

Produktion:

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

Standardavvikelse

Spridningen i data beräknas med standardavvikelsen eller sd() i R.

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

Produktion:

## # 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 finns massor av ojämlikhet i mängden homerun som görs av varje lag.

Minimum och maximum

Du kan komma åt minimum och maximum för en vektor med funktionen min() och max().

Koden nedan returnerar det lägsta och högsta antalet matcher under en säsong spelad av en spelare.

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

Produktion:

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

Att Räkna

Räkna observationer per grupp är alltid en bra idé. Med R kan du aggregera antalet förekomster med n().

Till exempel, koden nedan beräknar antalet år som varje spelare har spelat.

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

Produktion:

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

Du kan välja den första, sista eller n:e positionen i en grupp.

Du kan till exempel hitta det första och sista året för varje spelare.

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

Produktion:

## # 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:e observationen

Funktionen nth() är komplementär till first() och last(). Du kan komma åt den n:e observationen inom en grupp med indexet att returnera.

Till exempel kan du filtrera endast det andra året som ett lag spelade.

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

Produktion:

## # 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() returnerar antalet observationer i en aktuell grupp. En stängd funktion till n() är n_distinct(), som räknar antalet unika värden.

I nästa exempel lägger du ihop det totala antalet spelare som ett lag värvat under alla perioder.

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

Kodförklaring

  • group_by(teamID): Gruppera efter år och grupp
  • summarise(nummer_spelare = n_distinkt(playerID)): Räkna det distinkta antalet spelare per lag
  • arrange(desc(number_player)): Sortera data efter antalet spelare

Produktion:

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

Flera grupper

En sammanfattande statistik kan realiseras bland flera grupper.

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

Kodförklaring

  • group_by(yearID, teamID): Gruppera efter år och grupp
  • summarise(mean_games = mean(G)): Sammanfatta antalet spelare
  • arrange(desc(teamID, yearID)): Sortera data efter lag och år

Produktion:

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

Filtrera

Innan du tänker göra en operation kan du filtrera datamängden. Datauppsättningen startar 1871, och analysen behöver inte åren före 1980.

# Filter
data % > %
	filter(yearID > 1980) % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))

Kodförklaring

  • filter(yearID > 1980): Filtrera data för att endast visa relevanta år (dvs. efter 1980)
  • group_by(yearID): Gruppera efter år
  • summarise(mean_game_year = mean(G)): Sammanfatta data

Produktion:

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

Dela upp

Sist men inte minst måste du ta bort grupperingen innan du vill ändra nivån på beräkningen.

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

Kodförklaring

  • filter(HR >0) : Exkludera noll homerun
  • group_by(playerID): grupp för spelare
  • summarise(average_HR_game = summa(HR)/sum(G)): Beräkna genomsnittlig homerun per spelare
  • ungroup(): ta bort grupperingen
  • summarise(total_average_homerun = mean(average_HR_game)): Sammanfatta data

Produktion:

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

Sammanfattning

När du vill returnera en sammanfattning per grupp kan du använda:

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

du måste avgruppera data med:

ungroup(df)

Tabellen nedan sammanfattar funktionen du lärde dig med summarise()

Metod Funktion Koda
betyda betyda
summarise(df,mean_x1 = mean(x1))
median median
summarise(df,median_x1 = median(x1))
summan summan
summarise(df,sum_x1 = sum(x1))
standardavvikelse sd
summarise(df,sd_x1 = sd(x1))
interkvartil I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minsta min
summarise(df,minimum_x1 = min(x1))
maximal max
summarise(df,maximum_x1 = max(x1))
kvantil kvantil
summarise(df,quantile_x1 = quantile(x1))
första observationen först
summarise(df,first_x1 = first(x1))
sista observationen sista
summarise(df,last_x1 = last(x1))
n:e observationen Nth
summarise(df,nth_x1 = nth(x1, 2))
antal förekomster n
summarise(df,n_x1 = n(x1))
antal distinkta förekomster n_distinkt
summarise(df,n_distinct _x1 = n_distinct(x1))