Агрегатная функция R: пример суммирования и Group_by()

Сводная информация о переменной важна для получения представления о данных. Однако суммирование переменной по группам дает лучшую информацию о распределении данных.

В этом уроке вы узнаете, как суммировать набор данных по группам с помощью библиотеки dplyr.

В этом уроке вы будете использовать набор данных ватина. Исходный набор данных содержит 102816 наблюдений и 22 переменных. Вы будете использовать только 20 процентов этого набора данных и использовать следующие переменные:

  • playerID: идентификационный код игрока. Фактор
  • ID года: Год. Фактор
  • идентификатор команды: Команда. фактор
  • lgID: Лига. Фактор: AA AL FL NL PL UA
  • АБ: На летучих мышах. Числовой
  • G: Игры: количество игр, сыгранных игроком. Числовой
  • Р: Бежит. Числовой
  • HR: Хоумранс. Числовой
  • ШХ: Жертвенные хиты. Числовой

Перед выполнением обобщения необходимо выполнить следующие шаги по подготовке данных:

  • Шаг 1. Импортируйте данные
  • Шаг 2. Выберите соответствующие переменные
  • Шаг 3. Отсортируйте данные.
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)

Хорошей практикой при импорте набора данных является использование функции проблеска(), чтобы получить представление о структуре набора данных.

# Structure of the data
glimpse(data)

Вывод:

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

Подведем итог()

Синтаксис summarise() является простым и соответствует синтаксису других команд, включенных в библиотеку 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))

Код Пояснение

  • summarise(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))

Код Пояснение

  • среднее_SH = среднее(SH, na.rm = ИСТИНА): суммирование второй переменной. Вы устанавливаете na.rm = TRUE, поскольку столбец SH содержит отсутствующие наблюдения.

Вывод:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by против отсутствия group_by

Функция Summerise() без group_by() не имеет никакого смысла. Он создает сводную статистику по группам. Библиотека дплир автоматически применяет функцию к группе, которую вы передали внутри глагола group_by.

Обратите внимание, что group_by прекрасно работает со всеми другими глаголами (например, mutate(), filter(), Arrange(), …).

Оператор конвейера удобно использовать, когда у вас более одного шага. Вы можете вычислить средний хоумран по бейсбольной лиге.

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

Код Пояснение

  • данные: набор данных, используемый для построения сводной статистики.
  • group_by(lgID): вычислите сводку, сгруппировав переменную `lgID
  • summarise(mean_run = mean(HR)): вычислить средний хоумран.

Вывод:

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

Оператор канала также работает с ggplot(). Вы можете легко отобразить сводную статистику в виде графика. Все шаги помещаются внутрь конвейера до тех пор, пока не будет построен график. Кажется более наглядным увидеть средний хоумран по лиге с барным персонажем. Код ниже демонстрирует возможности объединения group_by(), summarise() и ggplot() вместе.

Вам предстоит выполнить следующий шаг:

  • Шаг 1. Выберите фрейм данных.
  • Шаг 2: Групповые данные
  • Шаг 3: Обобщите данные
  • Шаг 4. Постройте сводную статистику
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()"
        )
    )

Вывод:

Пример Group_by с суммированием

Функция в суммировании()

Глагол summarise() совместим почти со всеми функциями R. Вот краткий список полезных функций, которые вы можете использовать вместе с summarise():

Цель Функция Описание
Базовый значит() Среднее значение вектора x
медиана () Медиана вектора x
сумма () Сумма вектора x
изменение сд() стандартное отклонение вектора x
IQR() Интерквартиль вектора x
Диапазон мин () Минимум вектора x
Максимум() Максимум вектора x
квантиль() Квантиль вектора x
Позиция первый() Используйте с group_by() Первое наблюдение группы
последний() Используйте с group_by(). Последнее наблюдение группы
n-й() Используйте с group_by(). n-е наблюдение группы
Количество п () Используйте с group_by(). Посчитайте количество рядов
n_distinct() Используйте с group_by(). Подсчитайте количество различных наблюдений

Мы увидим примеры для каждой функции таблицы 1.

Основная функция

В предыдущем примере вы не сохранили сводную статистику во фрейме данных.

Вы можете выполнить два шага, чтобы создать рамку даты из сводки:

  • Шаг 1. Сохраните кадр данных для дальнейшего использования.
  • Шаг 2. Используйте набор данных для создания линейного графика.

Шаг 1) Вы подсчитываете среднее количество сыгранных игр по годам.

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

Код Пояснение

  • Сводная статистика набора данных о ударах хранится в кадре данных ex1.

Вывод:

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

Шаг 2) Вы показываете сводную статистику в виде линейного графика и видите тенденцию.

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

Вывод:

Пример базовой функции

Подмножество

Функция summarise() совместима с подмножеством.

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

Код Пояснение

  • median_at_bat_league_no_zero = median(AB[AB > 0]): переменная AB содержит много нулей. Вы можете сравнить медиану в биту переменная с 0 и без него.

Вывод:

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

Вы можете проверить, в каких лигах больше всего хоумранов.

## Sum
data % > %
	group_by(lgID) % > %
	summarise(sum_homerun_league = sum(HR))

Вывод:

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

Стандартное отклонение

Разброс данных вычисляется с помощью стандартного отклонения или sd() в R.

# Spread
data % > %
	group_by(teamID) % > %
	summarise(sd_at_bat_league = sd(HR))

Вывод:

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

Существует большое неравенство в количестве хоумранов, сделанных каждой командой.

Минимум и максимум

Вы можете получить доступ к минимуму и максимуму вектора с помощью функций min() и max().

Код ниже возвращает наименьшее и наибольшее количество игр, сыгранных игроком за сезон.

# Min and max
data % > %
	group_by(playerID) % > %
	summarise(min_G = min(G),
    max_G = max(G))

Вывод:

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

Количество

Всегда полезно подсчитывать наблюдения по группам. С помощью R вы можете агрегировать количество вхождений с помощью n().

Например, приведенный ниже код вычисляет количество лет, в течение которых играл каждый игрок.

# count observations
data % > %
	group_by(playerID) % > %
	summarise(number_year = n()) % > %
	arrange(desc(number_year))

Вывод:

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

Первый и последний

Вы можете выбрать первую, последнюю или n-ю позицию группы.

Например, вы можете найти первый и последний год каждого игрока.

# first and last
data % > %
	group_by(playerID) % > %
	summarise(first_appearance = first(yearID),
		last_appearance = last(yearID))

Вывод:

## # 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-е наблюдение

Функция nth() дополняет функции first() и Last(). Вы можете получить доступ к n-му наблюдению внутри группы с помощью возвращаемого индекса.

Например, вы можете отфильтровать только второй год, в котором играла команда.

# nth
data % > %
	group_by(teamID) % > %
	summarise(second_game = nth(yearID, 2)) % > %
	arrange(second_game)

Вывод:

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

Отдельное количество наблюдений

Функция n() возвращает количество наблюдений в текущей группе. Закрытой функцией n() является n_distinct(), которая подсчитывает количество уникальных значений.

В следующем примере вы суммируете общее количество игроков, набранных командой за все периоды.

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

Код Пояснение

  • group_by(teamID): группировать по годам. и команда
  • суммировать (number_player = n_distinct(playerID)): подсчитайте определенное количество игроков по командам.
  • Arrange(desc(number_player)): Сортировка данных по количеству игроков.

Вывод:

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

Несколько групп

Сводная статистика может быть реализована для нескольких групп.

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

Код Пояснение

  • group_by(yearID, teamID): Группировать по годам. и команда
  • summarise(mean_games =mean(G)): суммировать количество игроков в игре.
  • Arrange(desc(teamID,yearID)): сортировка данных по команде и году.

Вывод:

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

ФИЛЬТР

Прежде чем вы собираетесь выполнить операцию, вы можете отфильтровать набор данных. Набор данных начинается с 1871 года, и для анализа не нужны годы до 1980 года.

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

Код Пояснение

  • filter(yearID > 1980): фильтровать данные, чтобы отображать только соответствующие годы (т. е. после 1980 г.).
  • group_by(yearID): группировать по годам.
  • summarise(mean_game_year =mean(G)): суммировать данные.

Вывод:

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

Ungroup

И последнее, но не менее важное: вам необходимо удалить группировку, прежде чем вы захотите изменить уровень вычислений.

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

Код Пояснение

  • filter(HR >0): исключить нулевой хоумран
  • group_by(playerID): группировка по игроку
  • summarise(average_HR_game = sum(HR)/sum(G)): вычисляет средний хоумран игрока.
  • ungroup(): удалить группировку
  • summarise(total_average_homerun = mean(average_HR_game)): суммировать данные.

Вывод:

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

Резюме

Если вы хотите вернуть сводку по группе, вы можете использовать:

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

вам нужно разгруппировать данные с помощью:

ungroup(df)

В таблице ниже приведены функции, которые вы изучили с помощью summarise().

Способ доставки Функция Code
значить значить
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-е наблюдение энный
summarise(df,nth_x1 = nth(x1, 2))
количество вхождений n
summarise(df,n_x1 = n(x1))
количество отдельных случаев n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))