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.
Processo de Anรกlise de Dados
Processo de Anรกlise de Dados

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.

Mesclar dados com R Dplyr

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

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

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

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

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.

Vรกrios pares de chaves em R

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.

Exemplo de funรงรฃo reunir() em R

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.

Resuma esta postagem com: