R Обобщена функция: Обобщаване & Group_by () Пример

Съдържание:

Anonim

Обобщението на променлива е важно, за да имате представа за данните. Въпреки това, обобщаването на променлива по групи дава по-добра информация за разпределението на данните.

В този урок ще научите как обобщавате набор от данни по групи с библиотеката 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$ playerID  aardsda01, 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))