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