Utilizando o pacote dplyr
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 odata.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 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:
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.frame
s 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 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.