Mesclar quadros de dados em R: correspondência total e parcial

Muitas vezes, temos dados de múltiplas fontes. Para realizar uma análise, precisamos fundir dois dataframes juntos com um ou mais variáveis-chave comuns.

Neste tutorial, você aprenderá

Correspondência completa

Uma correspondência completa retorna valores que possuem uma contraparte na tabela de destino. Os valores que não correspondem não serão retornados no novo quadro de dados. A correspondência parcial, entretanto, retorna os valores ausentes como NA.

Veremos um simples junção interna. A palavra-chave inner join seleciona registros que possuem valores correspondentes em ambas as tabelas. Para unir dois conjuntos de dados, podemos usar a função merge(). Usaremos três argumentos:

merge(x, y, by.x = x, by.y = y)

Arguments:
-x: The origin data frame
-y: The data frame to merge
-by.x: The column used for merging in x data frame. Column x to merge on
-by.y: The column used for merging in y data frame. Column y to merge on

Exemplo:

Crie o primeiro conjunto de dados com variáveis

  • sobrenome
  • nacionalidade

Crie o segundo conjunto de dados com variáveis

  • sobrenome
  • filmes

A variável chave comum é o sobrenome. Podemos mesclar os dois dados e verificar se a dimensionalidade é 7×3.

Adicionamos stringsAsFactors=FALSE no quadro de dados porque não queremos R para converter string em fator, queremos que a variável seja tratada como caractere.

# Create origin dataframe(

producers <- data.frame(   
    surname =  c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"),    
    nationality = c("US","US","UK","US","Poland"),    
    stringsAsFactors=FALSE)

# Create destination dataframe
movies <- data.frame(    
    surname = c("Spielberg",
		"Scorsese",
                "Hitchcock",
              	"Hitchcock",
                "Spielberg",
                "Tarantino",
                "Polanski"),    
    title = c("Super 8",
    		"Taxi Driver",
    		"Psycho",
    		"North by Northwest",
    		"Catch Me If You Can",
    		"Reservoir Dogs","Chinatown"),                
     		stringsAsFactors=FALSE)

# Merge two datasets
m1 <- merge(producers, movies, by.x = "surname")
m1
dim(m1)

Saída:

surname		nationality		title
1 Hitchcock		UK		Psycho
2 Hitchcock		UK		North by Northwest
3 Polanski		Poland		Chinatown
4 Scorsese		US		Taxi Driver
5 Spielberg		US		Super 8
6 Spielberg		US		Catch Me If You Can
7 Tarantino		US		Reservoir Dogs

Vamos mesclar quadros de dados quando as variáveis-chave comuns tiverem nomes diferentes.

Mudamos o sobrenome para o nome no quadro de dados dos filmes. Usamos a função idêntica(x1, x2) para verificar se ambos os dataframes são idênticos.

# Change name of ` movies ` dataframe
colnames(movies)[colnames(movies) == 'surname'] <- 'name'
# Merge with different key value
m2 <- merge(producers, movies, by.x = "surname", by.y = "name")
# Print head of the data
head(m2)

Saída:

##surname     nationality		title
## 1 Hitchcock          UK		Psycho
## 2 Hitchcock          UK		North by Northwest
## 3 Polanski          Poland		Chinatown
## 4 Scorsese           US		Taxi Driver
## 5 Spielberg          US		Super 8
## 6 Spielberg          US		Catch Me If You Can
# Check if data are identical
identical(m1, m2)

Saída:

## [1] TRUE

Isso mostra que a operação de mesclagem é executada mesmo se os nomes das colunas forem diferentes.

Correspondência parcial

Não é surpreendente que dois dataframes não tenham as mesmas variáveis-chave comuns. No correspondência completa, o dataframe retorna linhas encontradas nos quadros de dados x e y. Com fusão parcial, é possível manter as linhas sem linhas correspondentes no outro quadro de dados. Essas linhas terão NA nas colunas que geralmente são preenchidas com valores de y. Podemos fazer isso definindo all.x= TRUE.

Por exemplo, podemos adicionar um novo produtor, Lucas, no quadro de dados do produtor sem as referências do filme no quadro de dados dos filmes. Se definirmos all.x= FALSE, R unirá apenas os valores correspondentes em ambos os conjuntos de dados. No nosso caso, o produtor Lucas não participará da fusão porque está faltando em um conjunto de dados.

Vamos ver a dimensão de cada saída quando especificamos all.x= TRUE e quando não o fazemos.

# Create a new producer
add_producer <-  c('Lucas', 'US')
#  Append it to the ` producer` dataframe
producers <- rbind(producers, add_producer)
# Use a partial merge 
m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE)
m3

Saída:

Correspondência Parcial

# Compare the dimension of each data frame
dim(m1)

Saída:

## [1] 7 3
dim(m2)

Saída:

## [1] 7 3
dim(m3)

Saída:

## [1] 8 3

Como podemos ver, a dimensão do novo quadro de dados é 8×3 em comparação com 7×3 para m1 e m2. R inclui NA para o autor ausente no quadro de dados do livro.