Código
<- read.csv("pnad_2017_amostra.csv") pnad_2017
Flavia de Jesus
24 de abril de 2021
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:
Ano | UF | Capital | RM_RIDE | V2007 | VD4016 | VD4017 | V5002A | V5002A2 | V2010 | VD3002 | VD4002 | V1032 | V2009 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 5 | NA | 116.1286 | 53 |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 295.7786 | 5 |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
5 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA | 4 | 4 | 1 | 403.8757 | 54 |
6 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | 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()
.
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 | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 5 | NA | 116.1286 | 53 |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 295.7786 | 5 |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
5 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA | 4 | 4 | 1 | 403.8757 | 54 |
6 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
2 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
3 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 695.0841 | 10 |
4 | 2017 | 24 | NA | 24 | 2 | NA | NA | 2 | NA | 1 | 7 | NA | 622.9802 | 15 |
5 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 288.5456 | 74 |
6 | 2017 | 24 | 24 | 24 | 2 | 2000 | 2000 | 2 | NA | 2 | 15 | 1 | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 27 | 27 | 27 | 2 | NA | NA | 1 | 124 | 5 | 5 | 2 | 462.0714 | 21 |
2 | 2017 | 23 | NA | 23 | 2 | NA | NA | 2 | NA | 5 | 11 | 2 | 212.2604 | 21 |
3 | 2017 | 41 | NA | NA | 2 | NA | NA | 2 | NA | 5 | 3 | NA | 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 <
.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 33 | NA | NA | 1 | 300 | 300 | 2 | NA | 4 | 8 | 1 | 243.4132 | 29 |
2 | 2017 | 33 | NA | NA | 1 | 937 | 937 | 2 | NA | 4 | 15 | 1 | 571.0787 | 27 |
3 | 2017 | 41 | NA | NA | 1 | 1677 | 1700 | 2 | NA | 4 | 8 | 1 | 426.4508 | 27 |
4 | 2017 | 21 | NA | NA | 1 | NA | NA | 2 | NA | 1 | 4 | NA | 411.5138 | 28 |
5 | 2017 | 42 | NA | 42 | 1 | 1500 | 1500 | 2 | NA | 1 | 15 | 1 | 336.1146 | 28 |
6 | 2017 | 35 | NA | NA | 1 | 1200 | 3600 | 2 | NA | 2 | 3 | 1 | 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):
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
2 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
3 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 695.0841 | 10 |
4 | 2017 | 24 | NA | 24 | 2 | NA | NA | 2 | NA | 1 | 7 | NA | 622.9802 | 15 |
5 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 288.5456 | 74 |
6 | 2017 | 24 | 24 | 24 | 2 | 2000 | 2000 | 2 | NA | 2 | 15 | 1 | 632.9212 | 37 |
Além dos valores lógicos um outro recurso importante do R são os valores faltantes, os NA
s. 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:
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 5 | NA | 116.1286 | 53 |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 295.7786 | 5 |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
5 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 695.0841 | 10 |
6 | 2017 | 24 | NA | 24 | 2 | NA | NA | 2 | NA | 1 | 7 | NA | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 25 | NA | NA | 2 | NA | NA | 1 | 425 | 4 | 0 | NA | 100.3146 | 33 |
2 | 2017 | 35 | 35 | 35 | 2 | 1350 | 1350 | 2 | NA | 4 | 11 | 1 | 1565.9688 | 22 |
3 | 2017 | 25 | NA | NA | 2 | NA | NA | 1 | 190 | 4 | 11 | NA | 151.7975 | 22 |
4 | 2017 | 29 | NA | NA | 2 | NA | NA | 1 | 150 | 4 | 5 | NA | 307.5332 | 22 |
5 | 2017 | 26 | NA | NA | 1 | 1600 | 1600 | 2 | NA | 1 | 8 | 1 | 268.9563 | 33 |
6 | 2017 | 52 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 11 | 2 | 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.
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:
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 | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | |
---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 |
5 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA |
6 | 2017 | 43 | NA | NA | 2 | NA | NA | 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”.
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.
idade | raca | ocupacao | Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | anos_estudo | peso_domicilio | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 53 | 4 | NA | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 5 | 116.1286 |
2 | 5 | 4 | NA | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 0 | 295.7786 |
3 | 10 | 1 | NA | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 3 | 88.6033 |
4 | 32 | 2 | NA | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 0 | 447.0010 |
5 | 54 | 4 | 1 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA | 4 | 403.8757 |
6 | 10 | 1 | NA | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 0 | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 13 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 77.20481 | 0 |
2 | 2017 | 21 | NA | NA | 2 | NA | NA | 2 | NA | 1 | NA | NA | 288.41435 | 0 |
3 | 2017 | 31 | NA | NA | 2 | NA | NA | 2 | NA | 2 | NA | NA | 239.92194 | 0 |
4 | 2017 | 31 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 662.46602 | 0 |
5 | 2017 | 26 | 26 | 26 | 1 | NA | NA | 2 | NA | 1 | NA | NA | 514.14054 | 0 |
6 | 2017 | 11 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 255.85428 | 0 |
Se formos fornecer mais de um nome de coluna, cada coluna adicional será usada para desapate nos valores das colunas anteriores.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 13 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 77.20481 | 0 |
2 | 2017 | 21 | NA | NA | 2 | NA | NA | 2 | NA | 1 | NA | NA | 288.41435 | 0 |
3 | 2017 | 31 | NA | NA | 2 | NA | NA | 2 | NA | 2 | NA | NA | 239.92194 | 0 |
4 | 2017 | 31 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 662.46602 | 0 |
5 | 2017 | 26 | 26 | 26 | 1 | NA | NA | 2 | NA | 1 | NA | NA | 514.14054 | 0 |
6 | 2017 | 11 | NA | NA | 1 | NA | NA | 2 | NA | 4 | NA | NA | 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()
.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 29 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 848.7943 | 86 |
2 | 2017 | 35 | NA | NA | 1 | NA | NA | 2 | NA | 1 | 4 | NA | 1204.5252 | 86 |
3 | 2017 | 35 | NA | NA | 1 | NA | NA | 2 | NA | 1 | 4 | NA | 386.5129 | 85 |
4 | 2017 | 31 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 4 | NA | 648.5864 | 84 |
5 | 2017 | 29 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 1773.1250 | 84 |
6 | 2017 | 43 | 43 | 43 | 1 | NA | NA | 2 | NA | 1 | 3 | NA | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | rendimento | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 5 | NA | 116.1286 | 53 | NA |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 295.7786 | 5 | NA |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 | NA |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 | NA |
5 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA | 4 | 4 | 1 | 403.8757 | 54 | 150 |
6 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 17 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 5 | NA | 116.1286 | 53 |
2 | 2017 | 16 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 0 | NA | 295.7786 | 5 |
3 | 2017 | 27 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 3 | NA | 88.6033 | 10 |
4 | 2017 | 21 | NA | NA | 2 | NA | NA | 1 | 240 | 2 | 0 | NA | 447.0010 | 32 |
5 | 2017 | 15 | 15 | 15 | 1 | 1500 | 600 | 2 | NA | 4 | 4 | 1 | 403.8757 | 54 |
6 | 2017 | 43 | NA | NA | 2 | NA | NA | 2 | NA | 1 | 0 | NA | 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.
Ano | UF | Capital | RM_RIDE | sexo | rendimento_habitual | rendimento_efetivo | bolsa_familia | valor_efetivamente_recebido | raca | anos_estudo | ocupacao | peso_domicilio | idade | uf_sigla | ano | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2017 | 32 | NA | NA | 1 | NA | NA | 2 | NA | 4 | 4 | NA | 164.9826 | 13 | ES | 2017 |
2 | 2017 | 32 | NA | NA | 2 | 100 | 100 | 2 | NA | 4 | 11 | 1 | 273.1574 | 31 | ES | 2017 |
3 | 2017 | 32 | NA | 32 | 1 | NA | NA | 2 | NA | 1 | 3 | NA | 238.8926 | 10 | ES | 2017 |
4 | 2017 | 32 | NA | 32 | 1 | NA | NA | 2 | NA | 2 | NA | NA | 272.8574 | 1 | ES | 2017 |
5 | 2017 | 32 | NA | 32 | 2 | 1200 | 1200 | 2 | NA | 4 | 11 | 1 | 329.9868 | 25 | ES | 2017 |
6 | 2017 | 32 | NA | 32 | 2 | 1000 | 1000 | 2 | NA | 4 | 11 | 1 | 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.
estudo | |
---|---|
1 | 6.779443 |
Podemos calcular diversas sumarizações diferentes em um mesmo summarize. Cada sumarização será uma coluna da nova base.
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.
sexo | raca | idade | |
---|---|---|---|
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 | |
---|---|---|
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.frame
s para chegar no resultado desejado.
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 dplyr
possui 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