Fusionner des trames de données dans R : correspondance complète et partielle

Très souvent, nous disposons de données provenant de plusieurs sources. Pour effectuer une analyse, nous devons fusionner deux trames de données avec une ou plusieurs variables clés communes.

Dans ce tutoriel, vous apprendrez

Correspondance parfaite

Une correspondance complète renvoie les valeurs qui ont une contrepartie dans la table de destination. Les valeurs qui ne correspondent pas ne seront pas renvoyées dans le nouveau bloc de données. Cependant, la correspondance partielle renvoie les valeurs manquantes sous la forme NA.

Nous verrons un simple jointure intérieure. Le mot-clé de jointure interne sélectionne les enregistrements dont les valeurs correspondent dans les deux tables. Pour joindre deux ensembles de données, nous pouvons utiliser la fonction merge(). Nous utiliserons trois arguments :

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

Mise en situation :

Créer le premier ensemble de données avec des variables

  • nom de famille
  • nationalité

Créer un deuxième ensemble de données avec des variables

  • nom de famille
  • films

La variable clé commune est le nom de famille. Nous pouvons fusionner les deux données et vérifier si la dimensionnalité est de 7×3.

Nous ajoutons stringsAsFactors=FALSE dans le bloc de données car nous ne voulons pas R pour convertir une chaîne en facteur, nous voulons que la variable soit traitée comme un caractère.

# 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)

Sortie :

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

Fusionnons les trames de données lorsque les variables clés communes ont des noms différents.

Nous changeons le nom de famille en nom dans la trame de données du film. Nous utilisons la fonction identique (x1, x2) pour vérifier si les deux trames de données sont identiques.

# 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)

Sortie :

##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)

Sortie :

## [1] TRUE

Cela montre que l'opération de fusion est effectuée même si les noms de colonnes sont différents.

Correspondance partielle

Il n’est pas surprenant que deux dataframes n’aient pas les mêmes variables clés communes. Dans le correspondance complète, la trame de données renvoie uniquement lignes trouvées dans les trames de données x et y. Avec fusion partielle, il est possible de conserver les lignes sans lignes correspondantes dans l'autre bloc de données. Ces lignes auront NA dans les colonnes qui sont généralement remplies de valeurs de y. Nous pouvons le faire en définissant all.x= TRUE.

Par exemple, nous pouvons ajouter un nouveau producteur, Lucas, dans la trame de données du producteur sans les références de films dans la trame de données des films. Si nous définissons all.x= FALSE, R joindra uniquement les valeurs correspondantes dans les deux ensembles de données. Dans notre cas, le producteur Lucas ne participera pas à la fusion car il manque dans un jeu de données.

Voyons la dimension de chaque sortie lorsque nous spécifions all.x= TRUE et lorsque nous ne le faisons pas.

# 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

Sortie :

Correspondance partielle

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

Sortie :

## [1] 7 3
dim(m2)

Sortie :

## [1] 7 3
dim(m3)

Sortie :

## [1] 8 3

Comme nous pouvons le voir, la dimension de la nouvelle trame de données 8×3 par rapport à 7×3 pour m1 et m2. R inclut NA pour l'auteur manquant dans la trame de données des livres.