Utilizando o pacote dplyr

21 minuto(s) de leitura

O dplyr é um pacote do R para manipulação de dados. Ele engloba muitas funções, também chamadas de verbos, que realizam diversas operações, tais como: aplicação de filtro, seleção de colunas específicas, classificação de dados, adição ou exclusão de colunas e agregação de dados. Além de possuir várias funções importantíssimas, o dplyr possui outras vantagens, como uma manipulação mais simples nos dados que possibilitam ao código uma escrita mais intuitiva e uma leitura simplificada.

Funções básicas

O dplyr possui muitas funcionalidades, no entanto neste post usaremos apenas as principais, que são:

  • rename(): Renomeia as variáveis (colunas).
  • filter(): Filtra registros (linhas).
  • select(): Seleciona variáveis por seus nomes.
  • arrange(): Ordena o data.frame de acordo com os valores de uma(s) coluna(s).
  • mutate(): Cria novas variáveis com funções de variáveis existentes.
  • summarize(): Reduz uma série de valores de uma coluna em um único valor.

Todas essas funções recebem no mínimo dois argumentos: o primeiro é o nome do data.frame e depois os argumentos referentes à função (nomes de colunas, funções, condições).

Dados

Vamos carregar uma base de dados de testes para explicarmos os exemplos. Escolhemos os dados brasileiros da PNAD de 2017, a Pesquisa Nacional por Amostras de Domicílio, que podem ser obtidos aqui. Para esse post, iremos considerar uma amostra dessa base com apenas algumas variáveis e que podem ser baixados clicando no link. Esses dados contém informações relacionadas ao ano da pesquisa, a capital em que viviam as pessoas entrevistadas no momento da pesquisa, a idade, o sexo, os rendimentos financeiros, a raça, os anos de estudo, se possui alguma ocupação e se recebe o bolsa família. Olhando rapidamente os dados, temos:

pnad_2017 <- read.csv("pnad_2017_amostra.csv")
head(pnad_2017) #imprime as primeiras linhas da base atribuída ao objeto pnad_2017.
##    Ano UF Capital RM_RIDE V2007 VD4016 VD4017 V5002A V5002A2 V2010 VD3002
## 1 2017 17      NA      NA     1     NA     NA      2      NA     4      5
## 2 2017 16      NA      NA     1     NA     NA      2      NA     4      0
## 3 2017 27      NA      NA     2     NA     NA      2      NA     1      3
## 4 2017 21      NA      NA     2     NA     NA      1     240     2      0
## 5 2017 15      15      15     1   1500    600      2      NA     4      4
## 6 2017 43      NA      NA     2     NA     NA      2      NA     1      0
##   VD4002    V1032 V2009
## 1     NA 116.1286    53
## 2     NA 295.7786     5
## 3     NA  88.6033    10
## 4     NA 447.0010    32
## 5      1 403.8757    54
## 6     NA 695.0841    10

Neste exemplo usamos a função read.csv() do pacote base do R para importar nossos dados, porém existem diversas funções e outros pacotes para importar dados que podem ser vistos aqui.

rename()

Vamos começar renomeando as variáveis usando a função rename().

library(dplyr) #carrega o pacote dplyr.
pnad <- rename(pnad_2017, sexo = V2007, 
               bolsa_familia = V5002A, anos_estudo = VD3002,
               valor_efetivamente_recebido = V5002A2, ocupacao = VD4002,
               rendimento_habitual = VD4016, rendimento_efetivo = VD4017,
               raca = V2010, idade = V2009, peso_domicilio = V1032)
head(pnad)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 17      NA      NA    1                  NA                 NA
## 2 2017 16      NA      NA    1                  NA                 NA
## 3 2017 27      NA      NA    2                  NA                 NA
## 4 2017 21      NA      NA    2                  NA                 NA
## 5 2017 15      15      15    1                1500                600
## 6 2017 43      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           5       NA
## 2             2                          NA    4           0       NA
## 3             2                          NA    1           3       NA
## 4             1                         240    2           0       NA
## 5             2                          NA    4           4        1
## 6             2                          NA    1           0       NA
##   peso_domicilio idade
## 1       116.1286    53
## 2       295.7786     5
## 3        88.6033    10
## 4       447.0010    32
## 5       403.8757    54
## 6       695.0841    10

As funções de dplyr nunca modificam suas entradas, então se você quiser salvar o resultado, precisará guardar o seu código em algum objeto usando o operador de atribuição <-.

filter()

A função filter() permite criar um subconjunto de observações com base em seus valores. O primeiro argumento é o nome do data.frame. O segundo argumento e os subsequentes são as expressões que filtram o data.frame. Por exemplo podemos filtrar todas as pessoas do sexo feminino que responderam a esta pesquisa. Na coluna sexo, o número 1 representa o sexo masculino e o número 2 representa o sexo feminino.

mulheres <- filter(pnad, sexo == 2)
head(mulheres)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 27      NA      NA    2                  NA                 NA
## 2 2017 21      NA      NA    2                  NA                 NA
## 3 2017 43      NA      NA    2                  NA                 NA
## 4 2017 24      NA      24    2                  NA                 NA
## 5 2017 43      NA      NA    2                  NA                 NA
## 6 2017 24      24      24    2                2000               2000
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    1           3       NA
## 2             1                         240    2           0       NA
## 3             2                          NA    1           0       NA
## 4             2                          NA    1           7       NA
## 5             2                          NA    1           3       NA
## 6             2                          NA    2          15        1
##   peso_domicilio idade
## 1        88.6033    10
## 2       447.0010    32
## 3       695.0841    10
## 4       622.9802    15
## 5       288.5456    74
## 6       632.9212    37

Quando executamos esta linha de código, o dplyr realiza a operação de filtragem e retorna um novo data.frame com as informações apenas das pessoas do sexo feminino da pesquisa. Podemos também filtrar mais de uma observação ao mesmo tempo. Por exemplo, vamos supor que queremos saber todas as informações apenas das mulheres indígenas que responderam a esta pesquisa. Na variável raca devemos utilizar o código 5 para obter essas observações.

mulher_indigena <- filter(pnad, sexo == 2, raca == 5)
head(mulher_indigena)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 27      27      27    2                  NA                 NA
## 2 2017 23      NA      23    2                  NA                 NA
## 3 2017 41      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             1                         124    5           5        2
## 2             2                          NA    5          11        2
## 3             2                          NA    5           3       NA
##   peso_domicilio idade
## 1       462.0714    21
## 2       212.2604    21
## 3       599.5468    77

Para a usar a filtragem melhor, o R fornece um conjunto de operadores de comparação, tais como: >, >=, <, <=, !=(diferente), ==(igual) e !(não). Neste próximo exemplo queremos selecionar todas as pessoas do sexo masculino que possuem idades entre 25 e 30 anos, então usaremos os operadores >e <.

homem_idade <- filter(pnad, sexo == 1, idade > 25, idade < 30 )
head(homem_idade)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 33      NA      NA    1                 300                300
## 2 2017 33      NA      NA    1                 937                937
## 3 2017 41      NA      NA    1                1677               1700
## 4 2017 21      NA      NA    1                  NA                 NA
## 5 2017 42      NA      42    1                1500               1500
## 6 2017 35      NA      NA    1                1200               3600
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           8        1
## 2             2                          NA    4          15        1
## 3             2                          NA    4           8        1
## 4             2                          NA    1           4       NA
## 5             2                          NA    1          15        1
## 6             2                          NA    2           3        1
##   peso_domicilio idade
## 1       243.4132    29
## 2       571.0787    27
## 3       426.4508    27
## 4       411.5138    28
## 5       336.1146    28
## 6       111.9671    26

Neste próximo exemplo vamos utilizar o operador !(não). Vamos supor que queremos selecionar todas as informações da PNAD_2017 apenas das pessoas do sexo feminino. Existem várias maneiras de fazer isso e uma delas é utilizando o operador !(não):

nao_homens <- filter(pnad, !(sexo == 1))
head(nao_homens)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 27      NA      NA    2                  NA                 NA
## 2 2017 21      NA      NA    2                  NA                 NA
## 3 2017 43      NA      NA    2                  NA                 NA
## 4 2017 24      NA      24    2                  NA                 NA
## 5 2017 43      NA      NA    2                  NA                 NA
## 6 2017 24      24      24    2                2000               2000
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    1           3       NA
## 2             1                         240    2           0       NA
## 3             2                          NA    1           0       NA
## 4             2                          NA    1           7       NA
## 5             2                          NA    1           3       NA
## 6             2                          NA    2          15        1
##   peso_domicilio idade
## 1        88.6033    10
## 2       447.0010    32
## 3       695.0841    10
## 4       622.9802    15
## 5       288.5456    74
## 6       632.9212    37

Além dos valores lógicos um outro recurso importante do R são os valores faltantes, os NAs. O código NA representa um valor desconhecido. Então vamos supor que queremos filtrar todas as pessoas que não informaram se possuem alguma ocupação ou não, usaremos então:

sem_informacao <- filter(pnad, is.na(ocupacao))
head(sem_informacao)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 17      NA      NA    1                  NA                 NA
## 2 2017 16      NA      NA    1                  NA                 NA
## 3 2017 27      NA      NA    2                  NA                 NA
## 4 2017 21      NA      NA    2                  NA                 NA
## 5 2017 43      NA      NA    2                  NA                 NA
## 6 2017 24      NA      24    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           5       NA
## 2             2                          NA    4           0       NA
## 3             2                          NA    1           3       NA
## 4             1                         240    2           0       NA
## 5             2                          NA    1           0       NA
## 6             2                          NA    1           7       NA
##   peso_domicilio idade
## 1       116.1286    53
## 2       295.7786     5
## 3        88.6033    10
## 4       447.0010    32
## 5       695.0841    10
## 6       622.9802    15

Podemos também utilizar mais de uma condição (usando & ou |). Se quisermos registros que atendam a todas as condições, podemos utilizar & (E) ou separar as condições por vírgulas. E quando for necessário registros que atendam a pelo menos uma condição, devemos utilizar o operador | (OU). Vamos agora filtrar pessoas com idade de 22 anos OU 33 anos que participaram da pesquisa.

idade_ou <- filter(pnad, idade == 22 | idade == 33)
head(idade_ou)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 25      NA      NA    2                  NA                 NA
## 2 2017 35      35      35    2                1350               1350
## 3 2017 25      NA      NA    2                  NA                 NA
## 4 2017 29      NA      NA    2                  NA                 NA
## 5 2017 26      NA      NA    1                1600               1600
## 6 2017 52      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             1                         425    4           0       NA
## 2             2                          NA    4          11        1
## 3             1                         190    4          11       NA
## 4             1                         150    4           5       NA
## 5             2                          NA    1           8        1
## 6             2                          NA    1          11        2
##   peso_domicilio idade
## 1       100.3146    33
## 2      1565.9688    22
## 3       151.7975    22
## 4       307.5332    22
## 5       268.9563    33
## 6       162.3579    22

select()

A função select() permite que você foque em um subconjunto útil usando operações baseadas nos nomes das variáveis. Neste primeiro exemplo utilizaremos a função select() para selecionar as colunas do banco de dados pelo nome. Não queremos todas as variáveis, queremos apenas as colunas anos_estudo e idade.

estudo_idade <- select(pnad, anos_estudo, idade)
head(estudo_idade)
##   anos_estudo idade
## 1           5    53
## 2           0     5
## 3           3    10
## 4           0    32
## 5           4    54
## 6           0    10

Podemos também selecionar as variáveis pelos índices das colunas. Por exemplo, se quisermos selecionar as colunas Ano, UF e Capital, podemos selecioná-las da seguintes maneira:

indice <- select(pnad, 1:3)
head(indice)
##    Ano UF Capital
## 1 2017 17      NA
## 2 2017 16      NA
## 3 2017 27      NA
## 4 2017 21      NA
## 5 2017 15      15
## 6 2017 43      NA

O operador : é muito útil para selecionar colunas consecutivas. Neste próximo exemplo selecionamos as colunas entre raca e idade, com elas incluso.

raca_idade <- select(pnad, raca:idade)
head(raca_idade)
##   raca anos_estudo ocupacao peso_domicilio idade
## 1    4           5       NA       116.1286    53
## 2    4           0       NA       295.7786     5
## 3    1           3       NA        88.6033    10
## 4    2           0       NA       447.0010    32
## 5    4           4        1       403.8757    54
## 6    1           0       NA       695.0841    10

Para retirar colunas da base de dados, basta acrescentar um - antes da seleção. Aqui selecionamos todas as colunas, exceto aquelas entre raca e idade, com elas incluso.

raca_idade2 <- select(pnad, -(raca:idade))
head(raca_idade2)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 17      NA      NA    1                  NA                 NA
## 2 2017 16      NA      NA    1                  NA                 NA
## 3 2017 27      NA      NA    2                  NA                 NA
## 4 2017 21      NA      NA    2                  NA                 NA
## 5 2017 15      15      15    1                1500                600
## 6 2017 43      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido
## 1             2                          NA
## 2             2                          NA
## 3             2                          NA
## 4             1                         240
## 5             2                          NA
## 6             2                          NA

Dentro da função select() podemos usar algumas funções auxiliares tais como:

  • starts_with("abc"): seleciona variáveis que comecem com “abc”.
  • ends_with("def"): seleciona variáveis que terminam em “def”.
  • contains("jkl"): seleciona variáveis que contém “jkl”.
  • num_range("x", 1:3): Seleciona variáveis que contém x1, x2 e x3.

Utilizando uma das funções auxiliares vamos selecionar a seguir todas as colunas que começam com o texto “rendimento”.

starts <- select(pnad, starts_with("rendimento"))
head(starts)
##   rendimento_habitual rendimento_efetivo
## 1                  NA                 NA
## 2                  NA                 NA
## 3                  NA                 NA
## 4                  NA                 NA
## 5                1500                600
## 6                  NA                 NA

Uma outra função auxiliar interessante dentro da função select() é o everything(), que tem como propósito mover variáveis para o começo do data.frame. Esta função é bem útil quando estamos usando uma base com muitas variáveis e queremos deixar algumas mais visíveis.

everything <- select(pnad, idade, raca, ocupacao, everything())
head(everything)
##   idade raca ocupacao  Ano UF Capital RM_RIDE sexo rendimento_habitual
## 1    53    4       NA 2017 17      NA      NA    1                  NA
## 2     5    4       NA 2017 16      NA      NA    1                  NA
## 3    10    1       NA 2017 27      NA      NA    2                  NA
## 4    32    2       NA 2017 21      NA      NA    2                  NA
## 5    54    4        1 2017 15      15      15    1                1500
## 6    10    1       NA 2017 43      NA      NA    2                  NA
##   rendimento_efetivo bolsa_familia valor_efetivamente_recebido anos_estudo
## 1                 NA             2                          NA           5
## 2                 NA             2                          NA           0
## 3                 NA             2                          NA           3
## 4                 NA             1                         240           0
## 5                600             2                          NA           4
## 6                 NA             2                          NA           0
##   peso_domicilio
## 1       116.1286
## 2       295.7786
## 3        88.6033
## 4       447.0010
## 5       403.8757
## 6       695.0841

arrange()

A função arrange() funciona de maneira similar a filter(), porém em vez de selecionar linhas ela muda a ordem delas. O primeiro argumento é a base de dados. Os demais argumentos são as colunas pelas quais queremos ordenar as linhas. Ela recebe um data.frame e um conjunto de nomes de coluna pelos quais ordenar. Queremos ordenar nossos dados, em ordem crescente, pelo nome do fator idade.

ordena_idade <- arrange(pnad, idade)
head(ordena_idade)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 13      NA      NA    1                  NA                 NA
## 2 2017 21      NA      NA    2                  NA                 NA
## 3 2017 31      NA      NA    2                  NA                 NA
## 4 2017 31      NA      NA    1                  NA                 NA
## 5 2017 26      26      26    1                  NA                 NA
## 6 2017 11      NA      NA    1                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4          NA       NA
## 2             2                          NA    1          NA       NA
## 3             2                          NA    2          NA       NA
## 4             2                          NA    4          NA       NA
## 5             2                          NA    1          NA       NA
## 6             2                          NA    4          NA       NA
##   peso_domicilio idade
## 1       77.20481     0
## 2      288.41435     0
## 3      239.92194     0
## 4      662.46602     0
## 5      514.14054     0
## 6      255.85428     0

Se formos fornecer mais de um nome de coluna, cada coluna adicional será usada para desapate nos valores das colunas anteriores.

idade_estudo <- arrange(pnad, idade, anos_estudo)
head(idade_estudo)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 13      NA      NA    1                  NA                 NA
## 2 2017 21      NA      NA    2                  NA                 NA
## 3 2017 31      NA      NA    2                  NA                 NA
## 4 2017 31      NA      NA    1                  NA                 NA
## 5 2017 26      26      26    1                  NA                 NA
## 6 2017 11      NA      NA    1                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4          NA       NA
## 2             2                          NA    1          NA       NA
## 3             2                          NA    2          NA       NA
## 4             2                          NA    4          NA       NA
## 5             2                          NA    1          NA       NA
## 6             2                          NA    4          NA       NA
##   peso_domicilio idade
## 1       77.20481     0
## 2      288.41435     0
## 3      239.92194     0
## 4      662.46602     0
## 5      514.14054     0
## 6      255.85428     0

Para que a ordenação seja feita de maneira decrescente basta utilizarmos o símbolo - ou então a função desc().

idade_desc <- arrange(pnad, desc(idade))
head(idade_desc)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 29      NA      NA    2                  NA                 NA
## 2 2017 35      NA      NA    1                  NA                 NA
## 3 2017 35      NA      NA    1                  NA                 NA
## 4 2017 31      NA      NA    2                  NA                 NA
## 5 2017 29      NA      NA    1                  NA                 NA
## 6 2017 43      43      43    1                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    1           0       NA
## 2             2                          NA    1           4       NA
## 3             2                          NA    1           4       NA
## 4             2                          NA    1           4       NA
## 5             2                          NA    4           0       NA
## 6             2                          NA    1           3       NA
##   peso_domicilio idade
## 1       848.7943    86
## 2      1204.5252    86
## 3       386.5129    85
## 4       648.5864    84
## 5      1773.1250    84
## 6       446.7535    82

mutate()

A função mutate() além de selecionar conjuntos de colunas existentes, é muito eficaz ao adicionar novas colunas que sejam funções de colunas existentes. mutate() sempre adiciona novas colunas no final de seu conjunto de dados. Por exemplo, em nossos dados temos o valor rendimento_habitual, mas estamos interessados em apenas 10% deste valor. Podemos conseguir esse valor multiplicando rendimento_habitual por 10 e dividindo por 100.

rendimento_hab <- mutate(pnad, rendimento =  rendimento_habitual*10/100)
head(rendimento_hab)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 17      NA      NA    1                  NA                 NA
## 2 2017 16      NA      NA    1                  NA                 NA
## 3 2017 27      NA      NA    2                  NA                 NA
## 4 2017 21      NA      NA    2                  NA                 NA
## 5 2017 15      15      15    1                1500                600
## 6 2017 43      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           5       NA
## 2             2                          NA    4           0       NA
## 3             2                          NA    1           3       NA
## 4             1                         240    2           0       NA
## 5             2                          NA    4           4        1
## 6             2                          NA    1           0       NA
##   peso_domicilio idade rendimento
## 1       116.1286    53         NA
## 2       295.7786     5         NA
## 3        88.6033    10         NA
## 4       447.0010    32         NA
## 5       403.8757    54        150
## 6       695.0841    10         NA

Também poderíamos ter substituido esta nova variável por uma já existente. Repare que desta vez não será adicionada nenhuma coluna no final da base de dados, a coluna rendimento_habitual terá apenas seus valores substituidos.

rendimento <- mutate(pnad, rendimento_habitual = rendimento_habitual*10/100)
head(rendimento)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 17      NA      NA    1                  NA                 NA
## 2 2017 16      NA      NA    1                  NA                 NA
## 3 2017 27      NA      NA    2                  NA                 NA
## 4 2017 21      NA      NA    2                  NA                 NA
## 5 2017 15      15      15    1                 150                600
## 6 2017 43      NA      NA    2                  NA                 NA
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           5       NA
## 2             2                          NA    4           0       NA
## 3             2                          NA    1           3       NA
## 4             1                         240    2           0       NA
## 5             2                          NA    4           4        1
## 6             2                          NA    1           0       NA
##   peso_domicilio idade
## 1       116.1286    53
## 2       295.7786     5
## 3        88.6033    10
## 4       447.0010    32
## 5       403.8757    54
## 6       695.0841    10

Podemos fazer qualquer operação com uma ou mais colunas. A única regra é que o resultado da operação retorne um vetor com comprimento igual ao número de linhas dos dados. Podemos criar e modificar quantas colunas quisermos dentro de um mesmo mutate.

dados_es <- filter(pnad, UF == 32)
dados_es <- mutate(dados_es, 
                   uf_sigla = "ES", 
                   ano = 2017)
head(dados_es)
##    Ano UF Capital RM_RIDE sexo rendimento_habitual rendimento_efetivo
## 1 2017 32      NA      NA    1                  NA                 NA
## 2 2017 32      NA      NA    2                 100                100
## 3 2017 32      NA      32    1                  NA                 NA
## 4 2017 32      NA      32    1                  NA                 NA
## 5 2017 32      NA      32    2                1200               1200
## 6 2017 32      NA      32    2                1000               1000
##   bolsa_familia valor_efetivamente_recebido raca anos_estudo ocupacao
## 1             2                          NA    4           4       NA
## 2             2                          NA    4          11        1
## 3             2                          NA    1           3       NA
## 4             2                          NA    2          NA       NA
## 5             2                          NA    4          11        1
## 6             2                          NA    4          11        1
##   peso_domicilio idade uf_sigla  ano
## 1       164.9826    13       ES 2017
## 2       273.1574    31       ES 2017
## 3       238.8926    10       ES 2017
## 4       272.8574     1       ES 2017
## 5       329.9868    25       ES 2017
## 6       437.8421    29       ES 2017

summarize()

A função summarize() reduz um data.frame a uma única linha. Para sumarizar uma coluna da base, utilizamos a função summarize(). O código abaixo resume a coluna anos_estudo pela sua média.

media_estudo <- summarize(pnad, estudo =  mean(anos_estudo, na.rm = TRUE))
head(media_estudo)
##     estudo
## 1 6.779443

Podemos calcular diversas sumarizações diferentes em um mesmo summarize. Cada sumarização será uma coluna da nova base.

sumarizando <- summarize(pnad,  
                         media_estudo = mean(anos_estudo, na.rm = TRUE),
                         mediana_idade = median(idade, na.rm = TRUE),
                         variancia_rendimento_hab = var(rendimento_habitual, 
                                                        na.rm = TRUE))
head(sumarizando)
##   media_estudo mediana_idade variancia_rendimento_hab
## 1     6.779443            31                  5721312

summarize() também pode ser usado acompanhado por group_by(). A função group_by() tem como finalidade agrupar vetores, ou seja, todas as variáveis que colocarmos dentro de uma função group_by() farão parte de um novo data.frame com apenas estas variáveis incluso.

grupo <- group_by(pnad, sexo, raca)
summarize(grupo, idade = mean(anos_estudo, na.rm = TRUE))
## # A tibble: 9 x 3
## # Groups:   sexo [2]
##    sexo  raca idade
##   <int> <int> <dbl>
## 1     1     1  6.85
## 2     1     2  5.23
## 3     1     3 15   
## 4     1     4  6.34
## 5     1     5  5   
## 6     2     1  8.28
## 7     2     2  6.03
## 8     2     4  6.35
## 9     2     5  6.33

pipe

Imagine que queiramos um data.frame com apenas duas colunas, a UF e a idade, no entanto queremos que a idade seja em ordem decrescente. Com todas as funções que aprendemos do dplyr até agora, o processo natural para conseguir este data.frame seria:

uf_idade <- select(pnad, UF, idade)
desc_idade <- arrange(uf_idade, desc(idade))
head(desc_idade)
##   UF idade
## 1 29    86
## 2 35    86
## 3 35    85
## 4 31    84
## 5 29    84
## 6 43    82

No entanto, uma das grandes vantagens do pacote dplyr é justamente poder fazer uma operação “atrás da outra” sem precisar fazer novas atribuições. O pipe é o operador que faz o encadeamento das funções do tidyverse. Ele irá pegar o resultado da expressão a sua esquerda e colocar como primeiro argumento da expressão da direita. Isso facilita a leitura do código, pois não precisamos fazer várias atribuições e gerar novos data.frames para chegar no resultado desejado.

pipe <- pnad %>%
  select(UF, idade) %>%
  arrange(desc(idade))
head(pipe)
##   UF idade
## 1 29    86
## 2 35    86
## 3 35    85
## 4 31    84
## 5 29    84
## 6 43    82

A solução para aplicar diversas operações de manipulação em uma base de dados é esta: aplicar o operador pipe. Da primeira para a segunda linha, estamos aplicando a função select() na base pnad. Da segunda para a terceira linha, estamos aplicando a função arrange() na base resultante da função select(). Aqui tem mais informações sobre o pipe.

join

Uma funcionalidade muito útil do pacote dplyr é o join, que é basicamente é a junção de dois conjuntos de dados por meio de um ou mais campos em comum. O pacote dplyrpossui várias funções para juntar dados e essas funções se enquadram em duas categorias: mutating joins e filtering joins.

Mutating joins: Adicionam novas variáveis de uma tabela às observações correspondentes em outra tabela.

Existem quatro tipos de mutating joins:

  • left_join(x, y): Retorna todas as linhas de x, e todas as colunas tanto de x quanto de y.
  • right_join(x, y): Retorna todas as linhas de y, e todas as colunas tanto de uma tabela x quanto da tabela y.
  • inner_join(x, y): Retorna todas as linhas de uma tabela x onde existem valores correspondentes em y e todas as colunas de x e y.
  • full_join(x, y): Retorna todas as linhas e todas as colunas tanto de x quanto de y. Retorna NA no caso de não haver valor correspondente.

Filtering joins: As funções do tipo mutating joins comparam as observações de duas tabelas de dados para determinar quais variáveis adicionar. Em contraste, as funções do tipo filtering joins mantêm apenas as observações da primeira tabela de dados e comparam as observações com uma segunda tabela de dados para determinar quais observações manter. Uma função do tipo Filtering joins apenas removerá as observações e nunca adicionará novas observações.

Existem dois tipos de filtering joins:

  • semi_join(x, y): Mantém todas as observações em uma tabela x que têm uma correspondência em uma tabela y.
  • anti_join(x, y): Mantém todas as observações em uma tabela x que não têm correspondência em uma tabela y.

Para mais informações sobre o join: clique aqui e aqui.

Se você gostou deste post e quer saber mais sobre o pacote dplyr, vou deixar os links em que você poderá aprender um pouco mais sobre o assunto.

Referências

https://r4ds.had.co.nz/transform.html

https://livro.curso-r.com/7-2-dplyr.html

Atualizado em: