Обобщението на променлива е важно, за да имате представа за данните. Въпреки това, обобщаването на променлива по групи дава по-добра информация за разпределението на данните.
В този урок ще научите как обобщавате набор от данни по групи с библиотеката dplyr.
В този урок ще научите
- Обобщение ()
- Group_by срещу no group_by
- Функция в summise ()
- Основна функция
- Поднастройка
- Сума
- Стандартно отклонение
- Минимум и максимум
- Броя
- Първо и последно
- n-то наблюдение
- Няколко групи
- Филтър
- Разгрупиране
За този урок ще използвате набора от данни за вата. Оригиналният набор от данни съдържа 102816 наблюдения и 22 променливи. Ще използвате само 20 процента от този набор от данни и ще използвате следните променливи:
- playerID: Идентификационен код на играча. Фактор
- yearID: Година. Фактор
- teamID: Екип. фактор
- lgID: Лига. Фактор: AA AL FL NL PL UA
- AB: При прилепите. Числови
- G: Игри: брой игри от играч. Числови
- R: Работи. Числови
- HR: Homeruns. Числови
- SH: Жертва хитове. Числови
Преди да извършите обобщение, ще направите следните стъпки, за да подготвите данните:
- Стъпка 1: Импортирайте данните
- Стъпка 2: Изберете съответните променливи
- Стъпка 3: Сортирайте данните
library(dplyr)# Step 1data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") %> %# Step 2select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH)) %> %# Step 3arrange(playerID, teamID, yearID)
Добра практика, когато импортирате набор от данни, е да използвате функцията glimpse (), за да имате представа за структурата на набора от данни.
# Structure of the dataglimpse(data)
Изход:
Observations: 104,324Variables: 9$ playerIDaardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a… $ yearID 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196… $ AB 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495,… $ teamID ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A… $ lgID NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL,… $ G 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15… $ R 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75… $ HR 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40… $ SH 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6,…
Обобщение ()
Синтаксисът на summarize () е основен и съответства на останалите глаголи, включени в библиотеката dplyr.
summarise(df, variable_name=condition)arguments:- `df`: Dataset used to construct the summary statistics- `variable_name=condition`: Formula to create the new variable
Вижте кода по-долу:
summarise(data, mean_run =mean(R))
Обяснение на кода
- обобщение (data, mean_run = mean (R)): Създава променлива с име mean_run, която е средната стойност на колоната, изпълнена от данните от набора от данни.
Изход:
## mean_run## 1 19.20114
Можете да добавяте колкото променливи искате. Връщате средните изиграни игри и средните жертви.
summarise(data, mean_games = mean(G),mean_SH = mean(SH, na.rm = TRUE))
Обяснение на кода
- mean_SH = средно (SH, na.rm = TRUE): Обобщава втора променлива. Задавате na.rm = TRUE, защото колоната SH съдържа липсващи наблюдения.
Изход:
## mean_games mean_SH## 1 51.98361 2.340085
Group_by срещу no group_by
Функцията summerise () без group_by () няма никакъв смисъл. Създава обобщена статистика по групи. Библиотеката dplyr прилага функция автоматично към групата, която сте предали в глагола group_by.
Имайте предвид, че group_by работи перфектно с всички останали глаголи (т.е. mutate (), filter (), order (), ...).
Удобно е да използвате оператора на тръбопровода, когато имате повече от една стъпка. Можете да изчислите средния хомерун по бейзболна лига.
data % > %group_by(lgID) % > %summarise(mean_run = mean(HR))
Обяснение на кода
- данни: Набор от данни, използван за изграждане на обобщената статистика
- group_by (lgID): Изчислете обобщението чрез групиране на променливата `lgID
- обобщение (mean_run = средно (HR)): Изчислете средния хомерун
Изход:
### A tibble: 7 x 2## lgID mean_run#### 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 0.2867133
Операторът на тръби работи и с ggplot (). Можете лесно да покажете обобщената статистика с графика. Всички стъпала се избутват вътре в тръбопровода, докато захващането не се начертае. Изглежда по-визуално да видите средния хомерун по лига с табела. Кодът по-долу демонстрира силата на комбиниране на group_by (), обобщение () и ggplot () заедно.
Ще направите следната стъпка:
- Стъпка 1: Изберете рамка за данни
- Стъпка 2: Групиране на данни
- Стъпка 3: Обобщете данните
- Стъпка 4: Начертайте обобщената статистика
library(ggplot2)# Step 1data % > %#Step 2group_by(lgID) % > %#Step 3summarise(mean_home_run = mean(HR)) % > %#Step 4ggplot(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()"))
Изход:
Функция в summise ()
Глаголът summarize () е съвместим с почти всички функции в R. Ето кратък списък с полезни функции, които можете да използвате заедно със summarize ():
Обективен | Функция | Описание |
---|---|---|
Основен | означава() | Средна стойност на вектор x |
Медиана() | Медиана на вектор x | |
сума () | Сума от вектор x | |
вариация | sd () | стандартно отклонение на вектор x |
IQR () | Интерквартил на вектор x | |
Обхват | мин () | Минимум на вектор x |
макс () | Максимум на вектор x | |
квантил () | Квантил на вектор x | |
Позиция | първо () | Използвайте с group_by () Първо наблюдение на групата |
последен () | Използвайте с group_by (). Последно наблюдение на групата | |
n-та () | Използвайте с group_by (). n-то наблюдение на групата | |
Броя | н() | Използвайте с group_by (). Пребройте броя на редовете |
n_distinct () | Използвайте с group_by (). Пребройте броя на отделните наблюдения |
Ще видим примери за всички функции на таблица 1.
Основна функция
В предишния пример не сте съхранили обобщената статистика в рамка с данни.
Можете да продължите в две стъпки, за да генерирате рамка за дата от обобщение:
- Стъпка 1: Съхранявайте рамката за данни за по-нататъшна употреба
- Стъпка 2: Използвайте набора от данни, за да създадете линейна графика
Стъпка 1) Изчислявате средния брой изиграни игри по година.
## Meanex1 <- data % > %group_by(yearID) % > %summarise(mean_game_year = mean(G))head(ex1)
Обяснение на кода
- Обобщената статистика на набора от данни за вата се съхранява в рамката за данни ex1.
Изход:
## # A tibble: 6 x 2## yearID mean_game_year#### 1 1871 23.42308## 2 1872 18.37931## 3 1873 25.61538## 4 1874 39.05263## 5 1875 28.39535## 6 1876 35.90625
Стъпка 2) Показвате обобщената статистика с линейна графика и виждате тенденцията.
# Plot the graphggplot(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"))
Изход:
Поднастройка
Функцията summarize () е съвместима с подгрупа.
## Subsetting + Mediandata % > %group_by(lgID) % > %summarise(median_at_bat_league = median(AB),#Compute the median without the zeromedian_at_bat_league_no_zero = median(AB[AB > 0]))
Обяснение на кода
- median_at_bat_league_no_zero = медиана (AB [AB> 0]): Променливата AB съдържа много 0. Можете да сравните медианата на променливата at с и без 0.
Изход:
## # A tibble: 7 x 3## lgID median_at_bat_league median_at_bat_league_no_zero#### 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 101 101
Сума
Друга полезна функция за агрегиране на променливата е sum ().
Можете да проверите в кои лиги има повече хомеруни.
## Sumdata % > %group_by(lgID) % > %summarise(sum_homerun_league = sum(HR))
Изход:
## # A tibble: 7 x 2## lgID sum_homerun_league#### 1 AA 341## 2 AL 29426## 3 FL 130## 4 NL 29817## 5 PL 98## 6 UA 46## 7 41
Стандартно отклонение
Разпространението в данните се изчислява със стандартното отклонение или sd () в R.
# Spreaddata % > %group_by(teamID) % > %summarise(sd_at_bat_league = sd(HR))
Изход:
## # A tibble: 148 x 2## teamID sd_at_bat_league#### 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
Има много неравенства в количеството хомерун, направено от всеки отбор.
Минимум и максимум
Можете да получите достъп до минимума и максимума на вектор с функцията min () и max ().
Кодът по-долу връща най-малкия и най-голям брой игри за сезон, изиграни от играч.
# Min and maxdata % > %group_by(playerID) % > %summarise(min_G = min(G),max_G = max(G))
Изход:
## # A tibble: 10,395 x 3## playerID min_G max_G#### 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
Броя
Преброяването на наблюденията по групи винаги е добра идея. С R можете да обобщите броя на появата с n ().
Например, кодът по-долу изчислява броя години, изиграни от всеки играч.
# count observationsdata % > %group_by(playerID) % > %summarise(number_year = n()) % > %arrange(desc(number_year))
Изход:
## # A tibble: 10,395 x 2## playerID number_year#### 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
Първо и последно
Можете да изберете първата, последната или n-та позиция на група.
Например можете да намерите първата и последната година на всеки играч.
# first and lastdata % > %group_by(playerID) % > %summarise(first_appearance = first(yearID),last_appearance = last(yearID))
Изход:
## # A tibble: 10,395 x 3## playerID first_appearance last_appearance#### 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-то наблюдение
Фондацията nth () допълва first () и last (). Можете да получите достъп до n-то наблюдение в група с индекс, който да върнете.
Например можете да филтрирате само втората година, в която е играл отбор.
# nthdata % > %group_by(teamID) % > %summarise(second_game = nth(yearID, 2)) % > %arrange(second_game)
Изход:
## # A tibble: 148 x 2## teamID second_game#### 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
Различен брой наблюдения
Функцията n () връща броя на наблюденията в текуща група. Затворена функция към n () е n_distinct (), която отчита броя на уникалните стойности.
В следващия пример сумирате общия брой играчи, наети отбор през всички периоди.
# distinct valuesdata % > %group_by(teamID) % > %summarise(number_player = n_distinct(playerID)) % > %arrange(desc(number_player))
Обяснение на кода
- group_by (teamID): Групиране по години и екип
- обобщение (number_player = n_distinct (playerID)): Пребройте различния брой играчи по отбор
- подредете (desc (number_player)): Сортирайте данните по броя на играчите
Изход:
## # A tibble: 148 x 2## teamID number_player#### 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
Няколко групи
Обобщена статистика може да бъде реализирана между множество групи.
# Multiple groupsdata % > %group_by(yearID, teamID) % > %summarise(mean_games = mean(G)) % > %arrange(desc(teamID, yearID))
Обяснение на кода
- group_by (yearID, teamID): Групиране по година и екип
- обобщение (mean_games = mean (G)): Обобщава броя на играчите
- подреждане (desc (teamID, yearID)): Сортирайте данните по екип и година
Изход:
## # A tibble: 2,829 x 3## # Groups: yearID [146]## yearID teamID mean_games#### 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
Филтър
Преди да възнамерявате да извършите операция, можете да филтрирате набора от данни. Наборът данни започва през 1871 г. и анализът не се нуждае от годините преди 1980 г.
# Filterdata % > %filter(yearID > 1980) % > %group_by(yearID) % > %summarise(mean_game_year = mean(G))
Обяснение на кода
- filter (yearID> 1980): Филтрирайте данните, за да покажете само съответните години (т.е. след 1980)
- group_by (yearID): Групиране по години
- обобщение (средна_игра_година = средно (G)): Обобщаване на данните
Изход:
## # A tibble: 36 x 2## yearID mean_game_year#### 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
Разгрупиране
Не на последно място, трябва да премахнете групирането, преди да искате да промените нивото на изчислението.
# Ungroup the datadata % > %filter(HR > 0) % > %group_by(playerID) % > %summarise(average_HR_game = sum(HR) / sum(G)) % > %ungroup() % > %summarise(total_average_homerun = mean(average_HR_game))
Обяснение на кода
- филтър (HR> 0): Изключете нула хомерун
- group_by (playerID): група по играч
- обобщение (средна_черта_игра = сума (HR) / сума (G)): Изчисляване на средния хомерун по играч
- ungroup (): премахване на групирането
- обобщение (total_average_homerun = средно (средна_HR_game)): Обобщаване на данните
Изход:
## # A tibble: 1 x 1## total_average_homerun#### 1 0.06882226
Обобщение
Когато искате да върнете резюме по групи, можете да използвате:
# group by X1, X2, X3group(df, X1, X2, X3)
трябва да дегрупирате данните с:
ungroup(df)
Таблицата по-долу обобщава функцията, която сте научили, summarize ()
метод |
функция |
код |
---|---|---|
означава |
означава |
summarise(df,mean_x1 = mean(x1)) |
Медиана |
Медиана |
summarise(df,median_x1 = median(x1)) |
сума |
сума |
summarise(df,sum_x1 = sum(x1)) |
стандартно отклонение |
sd |
summarise(df,sd_x1 = sd(x1)) |
интерквартилен |
IQR |
summarise(df,interquartile_x1 = IQR(x1)) |
минимум |
мин |
summarise(df,minimum_x1 = min(x1)) |
максимум |
макс |
summarise(df,maximum_x1 = max(x1)) |
квантил |
квантил |
summarise(df,quantile_x1 = quantile(x1)) |
първо наблюдение |
първо |
summarise(df,first_x1 = first(x1)) |
последно наблюдение |
последен |
summarise(df,last_x1 = last(x1)) |
n-то наблюдение |
n-ти |
summarise(df,nth_x1 = nth(x1, 2)) |
брой на събитията |
н |
summarise(df,n_x1 = n(x1)) |
брой на различните прояви |
n_distinct |
summarise(df,n_distinct _x1 = n_distinct(x1)) |