Συγχώνευση πλαισίων δεδομένων στο 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 για τον συγγραφέα που λείπει στο πλαίσιο δεδομένων βιβλίων.