No dia a dia, os dados ficam hospedados em diferentes servidores e espalhados por vários arquivos. Quando as informações de que você precisa vêm de múltiplas fontes, é essencial saber como agregá-las para perder o mínimo possível de informação e fazer combinações que realmente façam sentido com a estrutura dos seus dados.
Este tutorial vai mostrar:
- Como mesclar conjuntos de dados na horizontal e na vertical
- O que são chaves primárias e como elas dão estrutura aos seus dados
- Tipos de joins (por exemplo, left join, inner join, full join) e como escolher entre eles
- Um problema comum para ficar de olho e como resolvê-lo
Concatenando conjuntos de dados
Em linhas gerais, há duas formas de mesclar conjuntos de dados: adicionando mais linhas ou adicionando mais colunas ao seu dataset. Em geral, quando você tem conjuntos de dados com o mesmo conjunto de colunas ou com o mesmo conjunto de observações, dá para concatená-los vertical ou horizontalmente, respectivamente. Vamos aprender com alguns exemplos.
Adicionando conjuntos de dados na vertical
Quando você tem vários conjuntos de dados com o mesmo conjunto de colunas, pode concatenar um ao outro na vertical. Ou seja, mantendo as colunas do seu dataset, você pode adicionar mais linhas a ele. Ter tudo isso em um único arquivo facilita agregações e a visualização do todo, sem ter que ficar alternando entre vários arquivos e se perder no caminho.
Conjunto de dados 1
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
Conjunto de dados 2
| Make | Num models |
|---|---|
| Ford | 26 |
| Tesla | 4 |
É importante notar que, se você tiver a mesma observação em vários conjuntos de dados e concatená-los verticalmente usando rbind(), vai acabar com observações duplicadas na sua tabela. E, embora os dois conjuntos de dados precisem ter o mesmo conjunto de variáveis (isto é, colunas), elas não precisam estar na mesma ordem. Confira você mesmo no console abaixo!
No seu ambiente de trabalho, há dois conjuntos de dados chamados dataset1 e dataset2 mostrados acima. Tente reordenar as colunas de dataset1. Chame rbind() em dataset1 e dataset2, assim como em reordered_dataset1 e dataset2.
dataset1 <- data.frame(make = c("Honda", "BMW"),
num_models = c(63, 10))
dataset2 <- data.frame(make = c("Ford", "Tesla"),
num_models = c(26, 4))
# Add datasets vertically
rbind(dataset1, dataset2)
# Reorder columns
reordered_dataset1 <- dataset1[, c(2, 1)]
# See that rbind() is robust to column ordering
rbind(reordered_dataset1, dataset2)
Depois do rbind(), seus resultados devem ter informações sobre as quatro montadoras em uma única tabela, assim:
Conjunto de dados concatenado verticalmente
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
Comece a aprender R grátis
R intermediário
Adicionando conjuntos de dados na horizontal
Quando você tem conjuntos de dados que representam o mesmo conjunto de observações, pode concatená-los horizontalmente. Dessa vez, mantendo as linhas do seu dataset, você pode adicionar mais colunas a ele. Nesses casos, é importante verificar se a ordem das observações é a mesma. Se seus conjuntos de dados tiverem quantidades diferentes de linhas ou se tiverem o mesmo número de linhas, mas em ordens diferentes, você pode acabar pareando colunas de um com colunas do outro de um jeito que não faz sentido.
Vamos estender o exemplo acima. Suponha que você tenha dois arquivos: um com a montadora e o número de modelos únicos oferecidos e outro com a montadora e as vendas totais:
Número de modelos únicos oferecidos
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
Vendas totais
| Make | Sales |
|---|---|
| Ford | 119157 |
| BMW | 25908 |
| Honda | 188328 |
| Tesla | 29975 |
É importante notar que, se você tiver a mesma observação em vários conjuntos de dados e os concatenar horizontalmente com cbind(), vai acabar com colunas redundantes na tabela. E, embora os dois conjuntos contenham informações relacionadas, a ordem das linhas faz diferença!
No console abaixo, chame cbind() em models e sales e imprima o resultado:
models <- data.frame(make = c("Honda", "BMW", "Ford", "Tesla"),
num_models = c(63, 10, 26, 4))
sales <- data.frame(make = c("Ford", "BMW", "Honda", "Tesla"),
sales = c(119157, 25908, 188328, 29975))
# Add datasets horizontally
cbind(models, sales)
Você deve ter obtido algo assim:
Models & Sales
| Make | Num models | Make | Sales |
|---|---|---|---|
| Honda | 63 | Ford | 119157 |
| BMW | 10 | BMW | 25908 |
| Ford | 26 | Honda | 188328 |
| Tesla | 4 | Tesla | 29975 |
Percebeu o problema? Esses dados não estão tidy!
De acordo com os princípios de dados organizados (tidy data) ensinados neste curso fundamental, cada observação de um conjunto de dados deve estar em uma única linha. E se você tivesse informação apenas para algumas linhas em um dos conjuntos e quisesse adicionar colunas apenas para essas? Em outras palavras: e se você quisesse adicionar mais colunas de um conjunto para outro, mas eles não têm o mesmo número de observações?
Chave primária e chaves estrangeiras
O primeiro passo ao combinar conjuntos de dados é procurar a chave primária do seu dataset. A chave primária é a coluna (ou conjunto de colunas) que identifica de forma única cada observação. No exemplo com montadoras, número de modelos únicos e vendas totais, a chave primária dos seus conjuntos é a coluna make.
Agora podemos realizar joins, a forma padrão de mesclar conjuntos de dados em uma única tabela.
Tipos de joins
Existem vários tipos de join. Você pode aprender a acrescentar colunas de um conjunto a outro com joins de mutação, a filtrar um conjunto contra outro com joins de filtragem e a trabalhar com conjuntos por meio de operações de conjunto no curso Joining Data in R with dplyr. Abaixo estão alguns dos mais comuns.
left_join(x, y): retorna todas as linhas de x e todas as colunas de x e y. Linhas em x sem correspondência em y terão valores NA nas novas colunas. Se houver várias correspondências entre x e y, todas as combinações são retornadas.
inner_join(x, y): retorna todas as linhas de x que têm correspondência em y e todas as colunas de x e y. Se houver várias correspondências entre x e y, todas as combinações são retornadas.
full_join(x, y): retorna todas as linhas e todas as colunas de x e y. Onde não houver correspondência, a função retorna NA para o que estiver faltando.
Os joins acima são exemplos de joins de mutação, já que combinam variáveis de dois conjuntos de dados.
Chaves ausentes
Suponha que você tenha dois conjuntos de dados. O primeiro se chama size e contém os nomes das pessoas e seus tamanhos de camisa:
> size
name size
1 Tom M
2 Dan XL
3 Keil S
O segundo se chama color e contém os sobrenomes, as preferências de cor da camisa e armazena algumas informações no atributo row.names:
> color
surname color
Tom Jeon <NA>
Dan Smith Dark
Bob McLadden Light
Percebe o que pode dar errado? Joins entre duas tabelas podem ficar complicados quando há chaves ausentes ou duplicadas. Neste exemplo, os data frames do R armazenam informações importantes no atributo row.names. Quando isso acontece, você não consegue acessar a chave com uma função de join, já que essas funções só acessam colunas do data frame.
O truque para resolver isso facilmente é usar a função rownames_to_column() do pacote tibble. Ela retorna uma cópia do seu conjunto de dados com os nomes das linhas adicionados como uma coluna. O primeiro argumento de rownames_to_column() é o seu data frame e o segundo é uma string com o nome da coluna que você quer adicionar.
Tente explorar no console abaixo. Os conjuntos size e color já estão carregados no seu ambiente.
color <- data.frame(surname = c("Jeon", "Smith", "McLadden"), color = c(NA, "Dark", "Light"))
row.names(color) <- c("Tom", "Dan", "Bob")
size <- data.frame(name = c("Tom", "Dan", "Keil"), size = c("M", "XL", "S"))
# Explore here!
Considerações finais
Na prática, os dados podem vir divididos em muitos conjuntos e em vários formatos. Como o R é projetado para trabalhar com tabelas únicas, manipular e combinar conjuntos de dados em uma só tabela é uma habilidade essencial. Conclua a trilha de habilidades Importing & Cleaning Data with R e aprenda a analisar e combinar dados em qualquer formato. Confira também o tutorial de R Data Import da DataCamp. Bons estudos!
