R Aggregate-functie: Samenvatting en Group_by()-voorbeeld

Samenvatting van een variabele is belangrijk om een ​​idee te hebben over de data. Hoewel, een variabele samenvatten per groep geeft betere informatie over de distributie van de data.

In deze tutorial leert u hoe u een dataset per groep samenvat met behulp van de dplyr-bibliotheek.

Voor deze tutorial gebruikt u de batting-dataset. De originele dataset bevat 102816 observaties en 22 variabelen. U gebruikt slechts 20 procent van deze dataset en gebruikt de volgende variabelen:

  • spelerID: Speler-ID-code. Factor
  • jaarID: Jaar. Factor
  • teamID: Team. factor
  • lgID: Liga. Factor: AA AL FL NL PL UA
  • AB: Bij vleermuizen. Numeriek
  • G: Games: aantal games door een speler. Numeriek
  • R: loopt. Numeriek
  • HR: Homeruns. Numeriek
  • SH: Opofferingshits. Numeriek

Voordat u een samenvatting uitvoert, voert u de volgende stappen uit om de gegevens voor te bereiden:

  • Stap 1: Importeer de gegevens
  • Stap 2: Selecteer de relevante variabelen
  • Stap 3: Sorteer de gegevens
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)

Een goede gewoonte bij het importeren van een dataset is om de functie glimp() te gebruiken om een ​​idee te krijgen van de structuur van de dataset.

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

Samenvatten()

De syntaxis van summarise() is eenvoudig en consistent met de andere werkwoorden in de dplyr-bibliotheek.

summarise(df, variable_name=condition) 
arguments: 
- `df`: Dataset used to construct the summary statistics 
- `variable_name=condition`: Formula to create the new variable

Kijk naar de onderstaande code:

summarise(data, mean_run =mean(R))

Code Uitleg

  • summarise(data, mean_run = mean(R)): Maakt een variabele met de naam mean_run die het gemiddelde is van de kolomrun uit de datasetgegevens.

Output:

##   mean_run
## 1 19.20114

Je kunt zoveel variabelen toevoegen als je wilt. Je geeft het gemiddelde aantal gespeelde games en het gemiddelde aantal sacrifice hits terug.

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

Code Uitleg

  • mean_SH = mean(SH, na.rm = TRUE): Vat een tweede variabele samen. U stelt na.rm = TRUE in omdat de kolom SH ontbrekende observaties bevat.

Output:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by versus geen group_by

De functie summerise() zonder group_by() heeft geen enkele zin. Het creëert samenvattende statistieken per groep. De bibliotheek dplyr past automatisch een functie toe op de groep die u binnen het werkwoord group_by hebt doorgegeven.

Merk op dat group_by perfect werkt met alle andere werkwoorden (dwz muteren(), filter(), arrange(), …).

Het is handig om de pijplijnoperator te gebruiken als u meer dan één stap hebt. U kunt de gemiddelde homerun per honkbalcompetitie berekenen.

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

Code Uitleg

  • gegevens: gegevensset die wordt gebruikt om de samenvattende statistieken samen te stellen
  • group_by(lgID): Bereken de samenvatting door de variabele `lgID te groeperen
  • summarise(mean_run = mean(HR)): Bereken de gemiddelde 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	

De pipe operator werkt ook met ggplot(). Je kunt de samenvattingsstatistiek eenvoudig weergeven met een grafiek. Alle stappen worden in de pipeline gepusht totdat de grap is geplot. Het lijkt visueler om de gemiddelde homerun per league te zien met een staafdiagram. De onderstaande code demonstreert de kracht van het combineren van group_by(), summarise() en ggplot().

U voert de volgende stap uit:

  • Stap 1: Selecteer dataframe
  • Stap 2: Groepsgegevens
  • Stap 3: Vat de gegevens samen
  • Stap 4: Maak een overzicht van de samenvattende statistieken
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:

Groeperen op voorbeeld met Samenvatten

Functie in summarise()

Het werkwoord summarise() is compatibel met bijna alle functies in R. Hier is een korte lijst met nuttige functies die u samen met summarise() kunt gebruiken:

Objectief Functie Beschrijving
Basic gemeen() Gemiddelde van vector x
mediaan() Mediaan van vector x
som() Som van vector x
variatie SD() standaardafwijking van vector x
IQR() Interkwartiel van vector x
RANGE min () Minimaal vector x
max () Maximaal vector x
kwantiel() Kwantiel van vector x
Positie Eerst() Gebruiken met group_by() Eerste observatie van de groep
laatst() Gebruiken met group_by(). Laatste observatie van de groep
nde() Gebruiken met group_by(). zoveelste observatie van de groep
Tellen n () Gebruiken met group_by(). Tel het aantal rijen
n_distinct() Gebruiken met group_by(). Tel het aantal verschillende waarnemingen

We zullen voorbeelden zien voor elke functie van tabel 1.

Basis functie

In het vorige voorbeeld hebt u de samenvattende statistiek niet in een gegevensframe opgeslagen.

U kunt in twee stappen doorgaan om een ​​datumframe te genereren op basis van een samenvatting:

  • Stap 1: Bewaar het dataframe voor verder gebruik
  • Stap 2: Gebruik de dataset om een ​​lijndiagram te maken

Stap 1) U berekent het gemiddeld aantal gespeelde wedstrijden per jaar.

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

Code Uitleg

  • De samenvattende statistiek van de batting-dataset wordt opgeslagen in het dataframe 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	

Stap 2) U toont de samenvattende statistiek met een lijndiagram en ziet de trend.

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

Voorbeeld van basisfunctie

Subinstelling

De functie summarise() is compatibel met subsetting.

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

Code Uitleg

  • mediaan_at_bat_league_no_zero = mediaan(AB[AB > 0]): De variabele AB bevat veel 0. U kunt de mediaan van de aan slag variabele met en zonder 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	

Som

Een andere handige functie om de variabele te aggregeren is sum().

Je kunt controleren welke competities de meeste homeruns hebben.

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

Standaarddeviatie

De spreiding in de gegevens wordt berekend met de standaarddeviatie of sd() in 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		

Er is veel ongelijkheid in het aantal homeruns dat door elk team wordt gedaan.

Minimaal en maximaal

U kunt toegang krijgen tot het minimum en het maximum van een vector met de functies min() en max().

De onderstaande code retourneert het laagste en hoogste aantal wedstrijden dat een speler in een seizoen heeft gespeeld.

# 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

Tellen

Het is altijd een goed idee om observaties per groep te tellen. Met R kunt u het aantal keren dat het voorkomt samenvoegen met n().

De onderstaande code berekent bijvoorbeeld het aantal jaren dat elke speler heeft gespeeld.

# 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

Eerste en laatste

U kunt de eerste, laatste of n-de positie van een groep selecteren.

U kunt bijvoorbeeld van elke speler het eerste en het laatste jaartal vinden.

# 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

nde observatie

De functie nth() is complementair aan first() en last(). U kunt toegang krijgen tot de zoveelste waarneming binnen een groep met de index die u teruggeeft.

U kunt bijvoorbeeld alleen filteren op het tweede jaar dat een team heeft gespeeld.

# 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

Duidelijk aantal observaties

De functie n() retourneert het aantal waarnemingen in een huidige groep. Een gesloten functie voor n() is n_distinct(), die het aantal unieke waarden telt.

In het volgende voorbeeld tel je het totaal aantal spelers op dat een team gedurende alle periodes heeft gerecruteerd.

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

Code Uitleg

  • group_by(teamID): Groeperen op jaar en team
  • samenvatten(number_player = n_onderscheiden(spelerID)): Tel het specifieke aantal spelers per team
  • arrange(desc(number_player)): Sorteer de gegevens op het aantal spelers

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

Meerdere groepen

Er kan een samenvattende statistiek voor meerdere groepen worden gerealiseerd.

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

Code Uitleg

  • group_by(yearID, teamID): Groeperen op jaar en team
  • summarise(mean_games = mean(G)): Vat het aantal spelers samen
  • arrange(desc(teamID, yearID)): Sorteer de gegevens op team en jaar

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

Filter

Voordat u van plan bent een bewerking uit te voeren, kunt u de dataset filteren. De dataset begint in 1871 en de analyse heeft de jaren vóór 1980 niet nodig.

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

Code Uitleg

  • filter(yearID > 1980): Filter de gegevens om alleen de relevante jaren weer te geven (dat wil zeggen na 1980)
  • group_by(yearID): Groeperen op jaar
  • summarise(mean_game_year = mean(G)): Vat de gegevens samen

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

degroeperen

Last but not least moet u de groepering verwijderen voordat u het berekeningsniveau wilt wijzigen.

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

Code Uitleg

  • filter(HR >0): Sluit nul homerun uit
  • group_by(playerID): groeperen op speler
  • summarise(average_HR_game = sum(HR)/sum(G)): Bereken gemiddelde homerun per speler
  • ungroup(): verwijder de groepering
  • summarise(total_average_homerun = mean(average_HR_game)): Vat de gegevens samen

Output:

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

Samenvatting

Wanneer u een samenvatting per groep wilt retourneren, kunt u gebruik maken van:

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

u moet de gegevens degroeperen met:

ungroup(df)

De onderstaande tabel vat de functie samen die u hebt geleerd met summarise()

Methode Functie Code
gemiddelde gemiddelde
summarise(df,mean_x1 = mean(x1))
mediaan mediaan
summarise(df,median_x1 = median(x1))
som som
summarise(df,sum_x1 = sum(x1))
standaardafwijking sd
summarise(df,sd_x1 = sd(x1))
interkwartiel I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minimum Min
summarise(df,minimum_x1 = min(x1))
maximaal max
summarise(df,maximum_x1 = max(x1))
kwantiel kwantiel
summarise(df,quantile_x1 = quantile(x1))
eerste waarneming eerste
summarise(df,first_x1 = first(x1))
laatste waarneming laatste
summarise(df,last_x1 = last(x1))
nde observatie zoveelste
summarise(df,nth_x1 = nth(x1, 2))
aantal voorkomen n
summarise(df,n_x1 = n(x1))
aantal afzonderlijke gebeurtenissen n_onderscheiden
summarise(df,n_distinct _x1 = n_distinct(x1))