Συγχώνευση πλαισίων δεδομένων στο R: Πλήρης και μερική αντιστοίχιση

Πολύ συχνά, έχουμε δεδομένα από πολλές πηγές. Για να κάνουμε μια ανάλυση, πρέπει συγχώνευση δύο πλαίσια δεδομένων μαζί με ένα ή περισσότερα κοινές μεταβλητές κλειδιού.

Σε αυτό το σεμινάριο, θα μάθετε

Πλήρης αντιστοιχία

Μια πλήρης αντιστοίχιση επιστρέφει τιμές που έχουν αντίστοιχη στον πίνακα προορισμού. Οι τιμές που δεν ταιριάζουν δεν θα επιστρέφονται στο νέο πλαίσιο δεδομένων. Η μερική αντιστοίχιση, ωστόσο, επιστρέφει τις τιμές που λείπουν ως NA.

Θα δούμε ένα απλό εσωτερική σύνδεση. Η λέξη-κλειδί εσωτερικής ένωσης επιλέγει εγγραφές που έχουν αντίστοιχες τιμές και στους δύο πίνακες. Για να ενώσουμε δύο σύνολα δεδομένων, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση merge(). Θα χρησιμοποιήσουμε τρία επιχειρήματα:

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

Παράδειγμα:

Δημιουργήστε το πρώτο σύνολο δεδομένων με μεταβλητές

  • επώνυμο
  • εθνικότητα

Δημιουργήστε δεύτερο σύνολο δεδομένων με μεταβλητές

  • επώνυμο
  • κινηματογράφος

Η κοινή μεταβλητή κλειδιού είναι το επώνυμο. Μπορούμε να συγχωνεύσουμε και τα δύο δεδομένα και να ελέγξουμε αν η διάσταση είναι 7×3.

Προσθέτουμε stringsAsFactors=FALSE στο πλαίσιο δεδομένων γιατί δεν θέλουμε R για να μετατρέψουμε τη συμβολοσειρά ως παράγοντα, θέλουμε η μεταβλητή να αντιμετωπίζεται ως χαρακτήρας.

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

Παραγωγή:

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

Ας συγχωνεύσουμε πλαίσια δεδομένων όταν οι κοινές μεταβλητές κλειδιού έχουν διαφορετικά ονόματα.

Αλλάζουμε επώνυμο σε όνομα στο πλαίσιο δεδομένων ταινιών. Χρησιμοποιούμε τη συνάρτηση identical(x1, x2) για να ελέγξουμε αν και τα δύο πλαίσια δεδομένων είναι πανομοιότυπα.

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

Παραγωγή:

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

Παραγωγή:

## [1] TRUE

Αυτό δείχνει ότι η λειτουργία συγχώνευσης εκτελείται ακόμη και αν τα ονόματα των στηλών είναι διαφορετικά.

Μερικός αγώνας

Δεν προκαλεί έκπληξη το γεγονός ότι δύο πλαίσια δεδομένων δεν έχουν τις ίδιες κοινές μεταβλητές κλειδιού. Στο πλήρης αντιστοίχιση, επιστρέφει το πλαίσιο δεδομένων αποκλειστικά σειρές που βρίσκονται τόσο στο πλαίσιο δεδομένων x όσο και στο y. Με μερική συγχώνευση, είναι δυνατό να διατηρηθούν οι σειρές χωρίς αντίστοιχες σειρές στο άλλο πλαίσιο δεδομένων. Αυτές οι σειρές θα έχουν NA σε εκείνες τις στήλες που συνήθως γεμίζουν με τιμές από το y. Μπορούμε να το κάνουμε αυτό ορίζοντας all.x= TRUE.

Για παράδειγμα, μπορούμε να προσθέσουμε έναν νέο παραγωγό, τον Lucas, στο πλαίσιο δεδομένων παραγωγού χωρίς τις αναφορές ταινίας στο πλαίσιο δεδομένων ταινιών. Αν ορίσουμε all.x= FALSE, το R θα ενώσει μόνο τις τιμές που ταιριάζουν και στα δύο σύνολα δεδομένων. Στην περίπτωσή μας, ο παραγωγός Lucas δεν θα συμμετάσχει στη συγχώνευση επειδή λείπει από ένα σύνολο δεδομένων.

Ας δούμε τη διάσταση κάθε εξόδου όταν καθορίζουμε όλα.x= TRUE και πότε όχι.

# 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

Παραγωγή:

Μερικός αγώνας

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

Παραγωγή:

## [1] 7 3
dim(m2)

Παραγωγή:

## [1] 7 3
dim(m3)

Παραγωγή:

## [1] 8 3

Όπως μπορούμε να δούμε, η διάσταση του νέου πλαισίου δεδομένων είναι 8×3 σε σύγκριση με 7×3 για m1 και m2. Το R περιλαμβάνει NA για τον συγγραφέα που λείπει στο πλαίσιο δεδομένων βιβλίων.