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 só 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:
# 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.