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.
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.