Função de agregação R: Resumir & Group_by () Exemplo

Índice:

Anonim

O resumo de uma variável é importante para se ter uma ideia dos dados. Porém, resumir uma variável por grupo fornece melhores informações sobre a distribuição dos dados.

Neste tutorial, você aprenderá como resumir um conjunto de dados por grupo com a biblioteca dplyr.

Neste tutorial, você aprenderá

  • Resumir()
  • Group_by vs sem group_by
  • Função em sumarizar ()
  • Função básica
  • Subsetting
  • Soma
  • Desvio padrão
  • Mínimo e máximo
  • Contar
  • Primeiro e último
  • enésima observação
  • Vários grupos
  • Filtro
  • Desagrupar

Para este tutorial, você usará o conjunto de dados de rebatidas. O conjunto de dados original contém 1.02816 observações e 22 variáveis. Você usará apenas 20 por cento deste conjunto de dados e usará as seguintes variáveis:

  • playerID: código de identificação do jogador. Fator
  • yearID: ano. Fator
  • teamID: Equipe. fator
  • lgID: Liga. Fator: AA AL FL NL PL UA
  • AB: Em morcegos. Numérico
  • G: Jogos: número de jogos por jogador. Numérico
  • R: é executado. Numérico
  • HR: Homeruns. Numérico
  • SH: Golpes de sacrifício. Numérico

Antes de realizar o resumo, você executará as seguintes etapas para preparar os dados:

  • Etapa 1: importar os dados
  • Etapa 2: Selecione as variáveis ​​relevantes
  • Etapa 3: classificar os dados
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)

Uma boa prática ao importar um conjunto de dados é usar a função glimpse () para ter uma ideia sobre a estrutura do conjunto de dados.

# Structure of the dataglimpse(data)

Resultado:

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

Resumir()

A sintaxe de sumarizar () é básica e consistente com os outros verbos incluídos na biblioteca dplyr.

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

Observe o código abaixo:

summarise(data, mean_run =mean(R))

Explicação do código

  • resume (data, mean_run = mean (R)): Cria uma variável chamada mean_run que é a média da coluna executada a partir dos dados do conjunto de dados.

Resultado:

## mean_run## 1 19.20114

Você pode adicionar quantas variáveis ​​desejar. Você retorna a média de jogos jogados e os acertos de sacrifício médios.

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

Explicação do código

  • mean_SH = mean (SH, na.rm = TRUE): Resuma uma segunda variável. Você define na.rm = TRUE porque a coluna SH contém observações ausentes.

Resultado:

## mean_games mean_SH## 1 51.98361 2.340085 

Group_by vs sem group_by

A função summerise () sem group_by () não faz sentido. Ele cria estatísticas resumidas por grupo. A biblioteca dplyr aplica uma função automaticamente ao grupo que você passou dentro do verbo group_by.

Note que group_by funciona perfeitamente com todos os outros verbos (ie mutate (), filter (), organization (), ...).

É conveniente usar o operador de pipeline quando houver mais de uma etapa. Você pode calcular a média de homerun por liga de beisebol.

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

Explicação do código

  • dados: conjunto de dados usado para construir as estatísticas de resumo
  • group_by (lgID): Calcule o resumo agrupando a variável `lgID
  • sumarizar (mean_run = mean (HR)): Calcular o homerun médio

Resultado:

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

O operador de pipe também trabalha com ggplot (). Você pode facilmente mostrar a estatística resumida com um gráfico. Todas as etapas são empurradas dentro do pipeline até que a garra seja traçada. Parece mais visual ver o homerun médio por liga com um char de barra. O código a seguir demonstra o poder de combinar group_by (), sumarize () e ggplot () juntos.

Você fará a seguinte etapa:

  • Etapa 1: Selecione o quadro de dados
  • Etapa 2: dados do grupo
  • Etapa 3: Resuma os dados
  • Etapa 4: traçar as estatísticas de resumo
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()"))

Resultado:

Função em sumarizar ()

O verbo sumarizar () é compatível com quase todas as funções em R. Aqui está uma pequena lista de funções úteis que você pode usar junto com sumarizar ():

Objetivo Função Descrição
Básico significar() Média do vetor x
mediana() Mediana do vetor x
soma() Soma do vetor x
variação SD() desvio padrão do vetor x
IQR () Interquartil do vetor x
Faixa min () Mínimo do vetor x
max () Máximo do vetor x
quantil () Quantil do vetor x
Posição primeiro() Use com group_by () Primeira observação do grupo
último() Use com group_by (). Última observação do grupo
enésimo () Use com group_by (). enésima observação do grupo
Contar n () Use com group_by (). Conte o número de linhas
n_distinct () Use com group_by (). Conte o número de observações distintas

Veremos exemplos para todas as funções da tabela 1.

Função básica

No exemplo anterior, você não armazenou a estatística de resumo em um quadro de dados.

Você pode prosseguir em duas etapas para gerar um quadro de datas a partir de um resumo:

  • Etapa 1: armazene o quadro de dados para uso posterior
  • Etapa 2: use o conjunto de dados para criar um gráfico de linha

Etapa 1) Você calcula o número médio de jogos jogados por ano.

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

Explicação do código

  • A estatística resumida do conjunto de dados de rebatidas é armazenada no quadro de dados ex1.

Resultado:

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

Etapa 2) Você mostra a estatística resumida com um gráfico de linha e vê a tendência.

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

Resultado:

Subsetting

A função sumarizar () é compatível com subsetting.

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

Explicação do código

  • median_at_bat_league_no_zero = mediana (AB [AB> 0]): A variável AB contém muitos 0. Você pode comparar a mediana da variável at bat com e sem 0.

Resultado:

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

Soma

Outra função útil para agregar a variável é sum ().

Você pode verificar quais ligas têm mais homeruns.

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

Resultado:

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

Desvio padrão

A propagação dos dados é calculada com o desvio padrão ou sd () em R.

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

Resultado:

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

Existem muitas desigualdades na quantidade de homerun feitos por cada equipe.

Mínimo e máximo

Você pode acessar o mínimo e o máximo de um vetor com as funções min () e max ().

O código abaixo retorna o menor e o maior número de jogos em uma temporada disputada por um jogador.

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

Resultado:

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

Contar

Contar observações por grupo é sempre uma boa ideia. Com R, você pode agregar o número de ocorrências com n ().

Por exemplo, o código abaixo calcula o número de anos jogado por cada jogador.

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

Resultado:

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

Primeiro e último

Você pode selecionar a primeira, a última ou a enésima posição de um grupo.

Por exemplo, você pode encontrar o primeiro e o último ano de cada jogador.

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

Resultado:

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

enésima observação

A função enésima () é complementar à primeira () e à última (). Você pode acessar a enésima observação dentro de um grupo com o índice a ser retornado.

Por exemplo, você pode filtrar apenas o segundo ano em que um time jogou.

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

Resultado:

## # 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úmero distinto de observação

A função n () retorna o número de observações em um grupo atual. Uma função fechada para n () é n_distinct (), que conta o número de valores únicos.

No próximo exemplo, você soma o total de jogadores que uma equipe recrutou durante todos os períodos.

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

Explicação do código

  • group_by (teamID): Grupo por ano e equipe
  • sumarizar (number_player = n_distinct (playerID)): contar o número distinto de jogadores por equipe
  • organizar (desc (number_player)): Classificar os dados pelo número de jogadores

Resultado:

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

Vários grupos

Uma estatística resumida pode ser realizada entre vários grupos.

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

Explicação do código

  • group_by (yearID, teamID): Grupo por ano e equipe
  • sumarizar (mean_games = mean (G)): Resumir o número de jogadores no jogo
  • organizar (desc (teamID, yearID)): Classifique os dados por equipe e ano

Resultado:

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

Filtro

Antes de fazer uma operação, você pode filtrar o conjunto de dados. O conjunto de dados começa em 1871 e a análise não precisa dos anos anteriores a 1980.

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

Explicação do código

  • filtro (ID do ano> 1980): Filtre os dados para mostrar apenas os anos relevantes (ou seja, após 1980)
  • group_by (yearID): Grupo por ano
  • resumir (mean_game_year = mean (G)): Resuma os dados

Resultado:

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

Desagrupar

Por último, mas não menos importante, você precisa remover o agrupamento antes de alterar o nível de cálculo.

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

Explicação do código

  • filtro (HR> 0): Excluir zero homerun
  • group_by (playerID): grupo por jogador
  • resumir (average_HR_game = sum (HR) / sum (G)): Computar homerun médio por jogador
  • desagrupar (): remove o agrupamento
  • resumir (total_average_homerun = mean (average_HR_game)): Resuma os dados

Resultado:

## # A tibble: 1 x 1## total_average_homerun## ## 1 0.06882226

Resumo

Quando quiser retornar um resumo por grupo, você pode usar:

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

você precisa desagrupar os dados com:

ungroup(df) 

A tabela abaixo resume a função que você aprendeu com sumarizar ()

método

função

código

significar

significar

summarise(df,mean_x1 = mean(x1))

mediana

mediana

summarise(df,median_x1 = median(x1))

soma

soma

summarise(df,sum_x1 = sum(x1))

desvio padrão

SD

summarise(df,sd_x1 = sd(x1))

interquartil

IQR

summarise(df,interquartile_x1 = IQR(x1))

mínimo

min

summarise(df,minimum_x1 = min(x1))

máximo

max

summarise(df,maximum_x1 = max(x1))

quantil

quantil

summarise(df,quantile_x1 = quantile(x1))

primeira observação

primeiro

summarise(df,first_x1 = first(x1))

última observação

último

summarise(df,last_x1 = last(x1))

enésima observação

enésimo

summarise(df,nth_x1 = nth(x1, 2))

número de ocorrência

n

summarise(df,n_x1 = n(x1))

número de ocorrências distintas

n_distinto

summarise(df,n_distinct _x1 = n_distinct(x1))