R Összesítő függvény: Summarize & Group_by() Példa

Egy változó összefoglalása fontos ahhoz, hogy elképzelésünk legyen az adatokról. Bár egy változó csoportonkénti összegzése jobb információt ad az adatok eloszlásáról.

Ebből az oktatóanyagból megtudhatja, hogyan foglalhat össze egy adatkészletet csoportonként a dplyr könyvtárral.

Ehhez az oktatóanyaghoz az ütési adatkészletet fogja használni. Az eredeti adatkészlet 102816 megfigyelést és 22 változót tartalmaz. Ennek az adatkészletnek csak 20 százalékát fogja használni, és a következő változókat használja:

  • playerID: Játékosazonosító kód. Tényező
  • évazonosító: év. Tényező
  • teamID: Csapat. tényező
  • lgID: Liga. Tényező: AA AL FL NL PL UA
  • AB: A denevéreknél. Numerikus
  • G: Játékok: egy játékos által lejátszott játékok száma. Numerikus
  • R: Fut. Numerikus
  • HR: Homeruns. Numerikus
  • SH: Áldozatos találatok. Numerikus

Az összegzés elvégzése előtt a következő lépéseket kell végrehajtania az adatok előkészítéséhez:

  • 1. lépés: Importálja az adatokat
  • 2. lépés: Válassza ki a megfelelő változókat
  • 3. lépés: Rendezze az adatokat
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)

Az adatkészlet importálásakor bevált gyakorlat a glimpse() függvény használata, hogy képet kapjunk az adatkészlet szerkezetéről.

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

Összegzés ()

A summarise() szintaxisa alapvető, és összhangban van a dplyr könyvtárban található többi igével.

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

Nézd meg az alábbi kódot:

summarise(data, mean_run =mean(R))

Kód Magyarázat

  • summarise(data, mean_run = mean(R)): Létrehoz egy mean_run nevű változót, amely az adatkészlet adataiból futtatott oszlop átlaga.

output:

##   mean_run
## 1 19.20114

Annyi változót adhat hozzá, amennyit csak akar. Visszaadja az átlagos lejátszott meccseket és az átlagos áldozatot.

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

Kód Magyarázat

  • mean_SH = mean(SH, na.rm = TRUE): Foglaljon össze egy második változót. A na.rm = TRUE értéket adta meg, mert az SH oszlop hiányzó megfigyeléseket tartalmaz.

output:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs no group_by

A summerise() függvénynek a group_by() nélkül nincs értelme. Összefoglaló statisztikát készít csoportonként. A könyvtár dplyr automatikusan alkalmaz egy függvényt a group_by igén belül átadott csoportra.

Vegye figyelembe, hogy a group_by tökéletesen működik az összes többi igével (pl. mute(), filter(), arrange(), …).

Kényelmes a csővezeték-kezelő használata, ha egynél több lépése van. Kiszámolhatja az átlagos homerun baseball-bajnokság szerint.

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

Kód Magyarázat

  • adatok: az összefoglaló statisztika készítéséhez használt adatkészlet
  • group_by(lgID): Az összegzés kiszámítása az `lgID változó csoportosításával
  • summarise(mean_run = mean(HR)): Az átlagos homerun kiszámítása

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	

A pipe operátor a ggplot()-val is működik. Az összefoglaló statisztikát könnyen megjelenítheti grafikonnal. Az összes lépést a csővezeték belsejébe tolják, amíg a markolat meg nem jelenik. Vizuálisabbnak tűnik, ha az átlagos homerunt bajnokságonként láthatjuk egy bar char segítségével. Az alábbi kód bemutatja a group_by(), summarise() és ggplot() együttes kombinálásának erejét.

A következő lépést fogja tenni:

  • 1. lépés: Válassza ki az adatkeretet
  • 2. lépés: Csoportosítsa az adatokat
  • 3. lépés: Foglalja össze az adatokat
  • 4. lépés: Ábrázolja az összesített statisztikákat
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 példa az Összegzés funkcióval

Függvény in summarise()

A summarise() ige kompatibilis az R szinte összes függvényével. Íme egy rövid lista a summarise()-vel együtt használható hasznos függvényekről:

Objektív Funkció Leírás
alapvető átlagos() Az x vektor átlaga
középső() Az x vektor mediánja
összeg () Az x vektor összege
variáció SD() az x vektor szórása
IQR() Az x vektor interkvartilis
Választék perc () Az x vektor minimuma
max () Az x vektor maximuma
kvantilis() Az x vektor kvantilisa
pozíció első() Használja a group_by()-vel A csoport első megfigyelése
utolsó() Használja a group_by(). A csoport utolsó megfigyelése
nth() Használja a group_by(). A csoport n-edik megfigyelése
Gróf n() Használja a group_by(). Számolja meg a sorok számát
n_dinct() Használja a group_by(). Számolja meg a különböző megfigyelések számát

Példákat fogunk látni az 1. táblázat minden függvényére.

Alapvető funkció

Az előző példában az összesítő statisztikát nem adatkeretben tárolta.

Két lépésben folytathatja a dátumkeret létrehozását egy összegzésből:

  • 1. lépés: Tárolja az adatkeretet további használatra
  • 2. lépés: Használja az adatkészletet egy vonaldiagram létrehozásához

Step 1) Kiszámolja a lejátszott játékok átlagos számát évenként.

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

Kód Magyarázat

  • Az ütési adatkészlet összefoglaló statisztikája az ex1 adatkeretben tárolódik.

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	

Step 2) Megmutatja az összesítő statisztikát egy vonaldiagrammal, és látja a trendet.

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

Példa az alapfunkciókra

Részhalmaz

A summarise() függvény kompatibilis az alkészlettel.

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

Kód Magyarázat

  • median_at_bat_league_no_zero = medián(AB[AB > 0]): Az AB változó sok 0-t tartalmaz. Összehasonlíthatja a denevérnél változó 0-val és anélkül.

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	

Összeg

Egy másik hasznos függvény a változó aggregálására a sum().

Megnézheti, hogy melyik ligában van több homerun.

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

Szabvány eltérés

Az adatok szórását a szórással vagy az R-ben szereplő sd()-vel számítjuk ki.

# 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		

Sok egyenlőtlenség van az egyes csapatok által végzett homerun mennyiségében.

Minimum és maximum

Egy vektor minimumát és maximumát a min() és max() függvényekkel érhetjük el.

Az alábbi kód a játékos által lejátszott szezonban a legalacsonyabb és legmagasabb meccsszámot adja vissza.

# 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

Gróf

A megfigyelések csoportonkénti számolása mindig jó ötlet. R-vel az előfordulások számát az n()-el összesítheti.

Például az alábbi kód kiszámítja az egyes játékosok által lejátszott évek számát.

# 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

Első és utolsó

Kiválaszthatja egy csoport első, utolsó vagy n-edik pozícióját.

Megtalálhatja például minden játékos első és utolsó évét.

# 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-edik megfigyelés

Az nth() függvény a first() és last() kiegészítője. Az n-edik megfigyelést egy csoporton belül a visszatérni kívánt indexszel érheti el.

Például csak azt a második évet szűrheti, amikor egy csapat játszott.

# 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

Megkülönböztetett számú megfigyelés

Az n() függvény az aktuális csoportban lévő megfigyelések számát adja vissza. Az n() zárt függvénye az n_distinct(), amely megszámolja az egyedi értékek számát.

A következő példában összeadja azon játékosok számát, akiket a csapat az összes időszak során toborzott.

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

Kód Magyarázat

  • group_by(teamID): Csoportosítás év szerint és a csapat
  • summarise(szám_játékos = n_dinct(playerID)): Számolja meg a játékosok számát csapatonként
  • arrange(desc(szám_játékos)): Az adatok rendezése a játékosok száma szerint

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

Több csoport

Összefoglaló statisztika több csoport között is megvalósítható.

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

Kód Magyarázat

  • group_by(yearID, teamID): Csoportosítás év szerint és a csapat
  • summarise(mean_games = mean(G)): A játékosok számának összegzése
  • arrange(desc(teamID, yearID)): Rendezze az adatokat csapat és év szerint

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

Szűrő

Mielőtt műveletet végezne, szűrheti az adatkészletet. Az adathalmaz 1871-ben kezdődik, és az elemzéshez nincs szükség 1980 előtti évekre.

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

Kód Magyarázat

  • filter(yearID > 1980): Az adatok szűrése úgy, hogy csak a releváns éveket jelenítse meg (azaz 1980 után)
  • group_by(yearID): Csoportosítás év szerint
  • summarise(mean_game_year = átlag(G)): Az adatok összegzése

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

Csoportbontás

Végül, de nem utolsósorban el kell távolítania a csoportosítást, mielőtt módosítani szeretné a számítás szintjét.

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

Kód Magyarázat

  • filter(HR >0) : nulla homerun kizárása
  • group_by(playerID): csoport játékosonként
  • summarise(average_HR_game = sum(HR)/sum(G)): Az átlagos homerun kiszámítása játékosonként
  • ungroup(): a csoportosítás eltávolítása
  • summarise(total_average_homerun = mean(average_HR_game)): Az adatok összegzése

output:

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

Összegzésként

Ha csoportonként szeretne összefoglalót küldeni, a következőket használhatja:

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

le kell csoportosítania az adatokat a következővel:

ungroup(df)

Az alábbi táblázat összefoglalja a summarise() segítségével megtanult függvényt

Módszer Funkció Kód
jelent jelent
summarise(df,mean_x1 = mean(x1))
középső középső
summarise(df,median_x1 = median(x1))
összeg összeg
summarise(df,sum_x1 = sum(x1))
szórás sd
summarise(df,sd_x1 = sd(x1))
interkvartilis I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minimum perc
summarise(df,minimum_x1 = min(x1))
maximális max
summarise(df,maximum_x1 = max(x1))
kvantilis kvantilis
summarise(df,quantile_x1 = quantile(x1))
első megfigyelés első
summarise(df,first_x1 = first(x1))
utolsó megfigyelés utolsó
summarise(df,last_x1 = last(x1))
n-edik megfigyelés N.
summarise(df,nth_x1 = nth(x1, 2))
előfordulások száma n
summarise(df,n_x1 = n(x1))
egyedi előfordulások száma n_dinct
summarise(df,n_distinct _x1 = n_distinct(x1))