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