Tutorial Dplyr: mesclar e unir dados em R com exemplos
Introduรงรฃo ร anรกlise de dados
A anรกlise de dados pode ser dividida em trรชs partes:
- Processo de: Primeiro, precisamos coletar dados de muitas fontes e combinรก-los.
- Transformam: Esta etapa envolve a manipulaรงรฃo de dados. Depois de consolidarmos todas as fontes de dados, podemos comeรงar a limpar os dados.
- Visualize: O รบltimo passo รฉ visualizar nossos dados para verificar irregularidades.

Um dos desafios mais significativos enfrentados pelos cientistas de dados รฉ a manipulaรงรฃo de dados. Os dados nunca estรฃo disponรญveis no formato desejado. Os cientistas de dados precisam gastar pelo menos metade do seu tempo limpando e manipulando os dados. Essa รฉ uma das atribuiรงรตes mais crรญticas do trabalho. Se o processo de manipulaรงรฃo dos dados nรฃo for completo, preciso e rigoroso, o modelo nรฃo funcionarรก corretamente.
R Dplyr
R possui uma biblioteca chamada dplyr para auxiliar na transformaรงรฃo de dados. A biblioteca dplyr รฉ criada fundamentalmente em torno de quatro funรงรตes para manipular os dados e cinco verbos para limpar os dados. Depois disso, podemos usar a biblioteca ggplot para analisar e visualizar os dados.
Aprenderemos como usar a biblioteca dplyr para manipular um Quadro de dados.
Mesclar dados com R Dplyr
dplyr fornece uma maneira agradรกvel e conveniente de combinar conjuntos de dados. Podemos ter muitas fontes de dados de entrada e, em algum momento, precisaremos combinรก-las. Uma junรงรฃo com dplyr adiciona variรกveis โโร direita do conjunto de dados original.
Junรงรตes Dplyr
A seguir estรฃo quatro tipos importantes de junรงรตes usadas no dplyr para mesclar dois conjuntos de dados:
| funรงรฃo | Objetivo | Argumentos | Chaves mรบltiplas |
|---|---|---|---|
| Associaรงรฃo ร esquerda() | Mesclar dois conjuntos de dados. Mantenha todas as observaรงรตes da tabela de origem | dados, origem, destino, por = โIDโ | origem, destino, por = c(โIDโ, โID2โ) |
| right_join() | Mesclar dois conjuntos de dados. Mantenha todas as observaรงรตes da tabela de destino | dados, origem, destino, por = โIDโ | origem, destino, por = c(โIDโ, โID2โ) |
| junรงรฃo interna() | Mesclar dois conjuntos de dados. Exclui todas as linhas sem correspondรชncia | dados, origem, destino, por = โIDโ | origem, destino, por = c(โIDโ, โID2โ) |
| full_join() | Mesclar dois conjuntos de dados. Mantรฉm todas as observaรงรตes | dados, origem, destino, por = โIDโ | origem, destino, por = c(โIDโ, โID2โ) |
Estudaremos todos os tipos de junรงรตes atravรฉs de um exemplo fรกcil.
Em primeiro lugar, construรญmos dois conjuntos de dados. A Tabela 1 contรฉm duas variรกveis, ID e y, enquanto a Tabela 2 reรบne ID e z. Em cada situaรงรฃo, precisamos ter um par de chaves variรกvel. No nosso caso, ID รฉ o nosso chave variรกvel. A funรงรฃo procurarรก valores idรชnticos em ambas as tabelas e vincularรก os valores retornados ร direita da tabela 1.
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
Dplyr left_join()
A maneira mais comum de mesclar dois conjuntos de dados รฉ usar a funรงรฃo left_join(). Podemos ver na imagem abaixo que o par de chaves corresponde perfeitamente ร s linhas A, B, C e D de ambos os conjuntos de dados. No entanto, E e F sobraram. Como tratamos essas duas observaรงรตes? Com left_join(), manteremos todas as variรกveis โโna tabela original e nรฃo consideraremos as variรกveis โโque nรฃo possuem um par de chaves na tabela de destino. No nosso exemplo, a variรกvel E nรฃo existe na tabela 1. Portanto, a linha serรก eliminada. A variรกvel F vem da tabela de origem; ele serรก mantido apรณs left_join() e retornarรก NA na coluna z. A figura abaixo reproduz o que acontecerรก com left_join().
Exemplo de dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
Saรญda:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
Dplyr right_join()
A funรงรฃo right_join() funciona exatamente como left_join(). A รบnica diferenรงa รฉ a linha eliminada. O valor E, disponรญvel no quadro de dados de destino, existe na nova tabela e assume o valor NA para a coluna y.
Exemplo de dplyr right_join()
right_join(df_primary, df_secondary, by = 'ID')
Saรญda:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
Dplyr inner_join()
Quando tivermos 100% de certeza de que os dois conjuntos de dados nรฃo corresponderรฃo, podemos considerar retornar sรณ linhas existentes em ambos conjunto de dados. Isso รฉ possรญvel quando precisamos de um conjunto de dados limpo ou quando nรฃo queremos imputar valores ausentes com a mรฉdia ou mediana.
O inner_join() vem para ajudar. Esta funรงรฃo exclui as linhas sem correspondรชncia.
Exemplo de dplyr inner_join()
inner_join(df_primary, df_secondary, by ='ID')
Saรญda:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
Dplyr full_join()
Finalmente, a funรงรฃo full_join() mantรฉm todas as observaรงรตes e substitui os valores ausentes por NA.
Exemplo de dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
Saรญda:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
Vรกrios pares de chaves
Por รบltimo, mas nรฃo menos importante, podemos ter mรบltiplas chaves em nosso conjunto de dados. Considere o seguinte conjunto de dados onde temos anos ou uma lista de produtos comprados pelo cliente.
Se tentarmos mesclar as duas tabelas, R gerarรก um erro. Para remediar a situaรงรฃo, podemos passar duas variรกveis โโde pares de chaves. Ou seja, ID e ano que aparecem em ambos os conjuntos de dados. Podemos usar o seguinte cรณdigo para mesclar a tabela1 e a tabela 2
df_primary <- tribble(
~ID, ~year, ~items,
"A", 2015,3,
"A", 2016,7,
"A", 2017,6,
"B", 2015,4,
"B", 2016,8,
"B", 2017,7,
"C", 2015,4,
"C", 2016,6,
"C", 2017,6)
df_secondary <- tribble(
~ID, ~year, ~prices,
"A", 2015,9,
"A", 2016,8,
"A", 2017,12,
"B", 2015,13,
"B", 2016,14,
"B", 2017,6,
"C", 2015,15,
"C", 2016,15,
"C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))
Saรญda:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
Funรงรตes de limpeza de dados em R
A seguir estรฃo as quatro funรงรตes importantes para organizar (limpar) os dados:
| funรงรฃo | Objetivo | Argumentos |
|---|---|---|
| juntar() | Transforme os dados de largos em longos | (dados, chave, valor, na.rm = FALSE) |
| espalhar() | Transforme os dados de longos em largos | (dados, chave, valor) |
| separado() | Divida uma variรกvel em duas | (dados, col, into, set= โโ, remover = TRUE) |
| unidade() | Unir duas variรกveis โโem uma | (dados, col, conc, set= โโ, remover = TRUE) |
Usamos a biblioteca tidyr. Esta biblioteca pertence ao acervo da biblioteca para manipular, limpar e visualizar os dados. Se instalarmos R com anaconda, a biblioteca jรก estarรก instalada. Podemos encontrar a biblioteca aqui, https://anaconda.org/r/r-tidyr.
Se ainda nรฃo estiver instalado, digite o seguinte comando para instalar o tidyr:
install tidyr : install.packages("tidyr")
juntar()
O objetivo da funรงรฃo reunir() รฉ transformar os dados de largos em longos.
Sintaxe
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
Exemplo
Abaixo, podemos visualizar o conceito de remodelagem larga para longa. Queremos criar uma รบnica coluna chamada crescimento, preenchida pelas linhas das variรกveis โโdo trimestre.
library(tidyr)
# Create a messy dataset
messy <- data.frame(
country = c("A", "B", "C"),
q1_2017 = c(0.03, 0.05, 0.01),
q2_2017 = c(0.05, 0.07, 0.02),
q3_2017 = c(0.04, 0.05, 0.01),
q4_2017 = c(0.03, 0.02, 0.04))
messy
Saรญda:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data tidier <-messy %>% gather(quarter, growth, q1_2017:q4_2017) tidier
Saรญda:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
Na funรงรฃo reunir(), criamos duas novas variรกveis โโtrimestre e crescimento porque nosso conjunto de dados original tem uma variรกvel de grupo: ou seja, paรญs e os pares de valores-chave.
espalhar()
A funรงรฃo spread() faz o oposto de reunir.
Sintaxe
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
Exemplo
Podemos remodelar o conjunto de dados mais organizado de volta para bagunรงado com spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
Saรญda:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
separado()
A funรงรฃo separa() divide uma coluna em duas de acordo com um separador. Esta funรงรฃo รฉ รบtil em algumas situaรงรตes onde a variรกvel รฉ uma data. Nossa anรกlise pode exigir foco no mรชs e no ano e queremos separar a coluna em duas novas variรกveis.
Sintaxe
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
Exemplo
Podemos dividir o trimestre do ano no conjunto de dados mais organizado aplicando a funรงรฃo separa().
separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)
Saรญda:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
unir()
A funรงรฃo unite() concana duas colunas em uma.
Sintaxe
unit(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
Exemplo
No exemplo acima, separamos trimestre do ano. E se quisermos mesclรก-los. Usamos o seguinte cรณdigo:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
Saรญda:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
Resumo
- A anรกlise dos dados pode ser dividido em trรชs partes: Extraรงรฃo, Transformaรงรฃo e Visualizaรงรฃo.
- R possui uma biblioteca chamada dplyr para auxiliar na transformaรงรฃo de dados. A biblioteca dplyr รฉ criada fundamentalmente em torno de quatro funรงรตes para manipular os dados e cinco verbos para limpar os dados.
- dplyr fornece uma maneira agradรกvel e conveniente de combinar conjuntos de dados. Uma junรงรฃo com dplyr adiciona variรกveis โโร direita do conjunto de dados original.
- A beleza do dplyr รฉ que ele lida com quatro tipos de junรงรตes semelhantes a SQL:
- Associaรงรฃo ร esquerda() โ Para mesclar dois conjuntos de dados e manter todas as observaรงรตes da tabela de origem.
- right_join() โ Para mesclar dois conjuntos de dados e manter todas as observaรงรตes da tabela de destino.
- junรงรฃo interna() โ Para mesclar dois conjuntos de dados e excluir todas as linhas sem correspondรชncia.
- full_join() โ Para mesclar dois conjuntos de dados e manter todas as observaรงรตes.
- Usando a biblioteca tidyr, vocรช pode transformar um conjunto de dados usando as seguintes funรงรตes:
- juntar(): Transforme os dados de largos em longos.
- espalhar(): Transforme os dados de longos em largos.
- separado(): Divida uma variรกvel em duas.
- unidade(): Una duas variรกveis โโem uma.







