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.
  • Transformar: Esta etapa envolve a manipulação de dados. Depois de consolidarmos todas as fontes de dados, podemos começar a limpar os dados.
  • Visualizar: 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 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.