Εκμάθηση Dplyr: Συγχώνευση και ένωση δεδομένων στο R με παραδείγματα
Εισαγωγή στην Ανάλυση Δεδομένων
Η ανάλυση δεδομένων μπορεί να χωριστεί σε τρία μέρη:
- Εξαγωγή: Αρχικά, πρέπει να συλλέξουμε τα δεδομένα από πολλές πηγές και να τα συνδυάσουμε.
- Μεταμορφώστε: Αυτό το βήμα περιλαμβάνει τον χειρισμό δεδομένων. Αφού έχουμε ενοποιήσει όλες τις πηγές δεδομένων, μπορούμε να αρχίσουμε να καθαρίζουμε τα δεδομένα.
- Φαντάζομαι: Η τελευταία κίνηση είναι να οπτικοποιήσουμε τα δεδομένα μας για να ελέγξουμε την παρατυπία.

Μία από τις πιο σημαντικές προκλήσεις που αντιμετωπίζουν οι επιστήμονες δεδομένων είναι η χειραγώγηση των δεδομένων. Τα δεδομένα δεν είναι ποτέ διαθέσιμα στην επιθυμητή μορφή. Οι επιστήμονες δεδομένων πρέπει να αφιερώνουν τουλάχιστον τον μισό χρόνο τους, καθαρίζοντας και χειραγωγώντας τα δεδομένα. Αυτή είναι μια από τις πιο κρίσιμες αποστολές στη δουλειά. Εάν η διαδικασία χειρισμού δεδομένων δεν είναι πλήρης, ακριβής και αυστηρή, το μοντέλο δεν θα λειτουργήσει σωστά.
R Dplyr
Το R έχει μια βιβλιοθήκη που ονομάζεται dplyr για να βοηθήσει στον μετασχηματισμό δεδομένων. Η βιβλιοθήκη dplyr δημιουργείται βασικά γύρω από τέσσερις λειτουργίες για τον χειρισμό των δεδομένων και πέντε ρήματα για τον καθαρισμό των δεδομένων. Μετά από αυτό, μπορούμε να χρησιμοποιήσουμε τη βιβλιοθήκη ggplot για να αναλύσουμε και να οπτικοποιήσουμε τα δεδομένα.
Θα μάθουμε πώς να χρησιμοποιούμε τη βιβλιοθήκη dplyr για να χειριστούμε ένα Πλαίσιο δεδομένων.
Συγχώνευση δεδομένων με το R Dplyr
Το dplyr παρέχει έναν ωραίο και βολικό τρόπο συνδυασμού συνόλων δεδομένων. Μπορεί να έχουμε πολλές πηγές δεδομένων εισόδου και κάποια στιγμή πρέπει να τις συνδυάσουμε. Μια ένωση με dplyr προσθέτει μεταβλητές στα δεξιά του αρχικού συνόλου δεδομένων.
Dplyr Joins
Ακολουθούν τέσσερις σημαντικοί τύποι συνδέσεων που χρησιμοποιούνται στο dplyr για τη συγχώνευση δύο συνόλων δεδομένων:
Λειτουργία | Σκοπός | Επιχειρήματα | Πολλαπλά πλήκτρα |
---|---|---|---|
left_join() | Συγχώνευση δύο συνόλων δεδομένων. Κρατήστε όλες τις παρατηρήσεις από τον πίνακα προέλευσης | δεδομένα, προέλευση, προορισμός, κατά = "ID" | προέλευση, προορισμός, κατά = c("ID", "ID2") |
right_join() | Συγχώνευση δύο συνόλων δεδομένων. Διατηρήστε όλες τις παρατηρήσεις από τον πίνακα προορισμού | δεδομένα, προέλευση, προορισμός, κατά = "ID" | προέλευση, προορισμός, κατά = c("ID", "ID2") |
εσωτερική σύνδεση() | Συγχώνευση δύο συνόλων δεδομένων. Εξαιρεί όλες τις μη αντιστοιχισμένες σειρές | δεδομένα, προέλευση, προορισμός, κατά = "ID" | προέλευση, προορισμός, κατά = c("ID", "ID2") |
full_join() | Συγχώνευση δύο συνόλων δεδομένων. Τηρεί όλες τις παρατηρήσεις | δεδομένα, προέλευση, προορισμός, κατά = "ID" | προέλευση, προορισμός, κατά = c("ID", "ID2") |
Θα μελετήσουμε όλους τους τύπους ενώσεων μέσω ενός εύκολου παραδείγματος.
Πρώτα απ 'όλα, χτίζουμε δύο σύνολα δεδομένων. Ο Πίνακας 1 περιέχει δύο μεταβλητές, το ID και το y, ενώ ο Πίνακας 2 συγκεντρώνει το ID και το z. Σε κάθε περίπτωση, πρέπει να έχουμε ένα κλειδί-ζεύγος μεταβλητός. Στην περίπτωσή μας, η ταυτότητα είναι δική μας κλειδί μεταβλητός. Η συνάρτηση θα αναζητήσει πανομοιότυπες τιμές και στους δύο πίνακες και θα δεσμεύσει τις επιστρεφόμενες τιμές στα δεξιά του πίνακα 1.
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
Dplyr left_join()
Ο πιο συνηθισμένος τρόπος για να συγχωνεύσετε δύο σύνολα δεδομένων είναι να χρησιμοποιήσετε τη συνάρτηση left_join(). Μπορούμε να δούμε από την παρακάτω εικόνα ότι το ζεύγος κλειδιών ταιριάζει απόλυτα με τις σειρές A, B, C και D και από τα δύο σύνολα δεδομένων. Περισσεύουν όμως τα Ε και ΣΤ. Πώς αντιμετωπίζουμε αυτές τις δύο παρατηρήσεις; Με την left_join(), θα κρατήσουμε όλες τις μεταβλητές στον αρχικό πίνακα και δεν θα λάβουμε υπόψη τις μεταβλητές που δεν έχουν ζεύγος κλειδιών στον πίνακα προορισμού. Στο παράδειγμά μας, η μεταβλητή Ε δεν υπάρχει στον πίνακα 1. Επομένως, η σειρά θα απορριφθεί. Η μεταβλητή F προέρχεται από τον πίνακα προέλευσης. θα διατηρηθεί μετά την left_join() και θα επιστρέψει NA στη στήλη z. Το παρακάτω σχήμα αναπαράγει τι θα συμβεί με μια left_join().
Παράδειγμα dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
Παραγωγή:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
Dplyr right_join()
Η συνάρτηση right_join() λειτουργεί ακριβώς όπως left_join(). Η μόνη διαφορά είναι ότι η σειρά έπεσε. Η τιμή E, διαθέσιμη στο πλαίσιο δεδομένων προορισμού, υπάρχει στον νέο πίνακα και παίρνει την τιμή NA για τη στήλη y.
Παράδειγμα dplyr right_join()
right_join(df_primary, df_secondary, by = 'ID')
Παραγωγή:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
Dplyr inner_join()
Όταν είμαστε 100% σίγουροι ότι τα δύο σύνολα δεδομένων δεν θα ταιριάζουν, μπορούμε να σκεφτούμε να επιστρέψουμε αποκλειστικά σειρές που υπάρχουν σε και οι δύο σύνολο δεδομένων. Αυτό είναι δυνατό όταν χρειαζόμαστε ένα καθαρό σύνολο δεδομένων ή όταν δεν θέλουμε να υπολογίσουμε τιμές που λείπουν με τη μέση ή τη διάμεσο.
Το inner_join() έρχεται να βοηθήσει. Αυτή η συνάρτηση εξαιρεί τις μη αντιστοιχισμένες σειρές.
Παράδειγμα dplyr inner_join()
inner_join(df_primary, df_secondary, by ='ID')
Παραγωγή:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
Dplyr full_join()
Τέλος, η συνάρτηση full_join() διατηρεί όλες τις παρατηρήσεις και αντικαθιστά τις τιμές που λείπουν με NA.
Παράδειγμα dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
Παραγωγή:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
Πολλαπλά ζεύγη κλειδιών
Τελευταίο αλλά εξίσου σημαντικό, μπορούμε να έχουμε πολλά κλειδιά στο σύνολο δεδομένων μας. Εξετάστε το ακόλουθο σύνολο δεδομένων όπου έχουμε χρόνια ή μια λίστα προϊόντων που αγόρασε ο πελάτης.
Αν προσπαθήσουμε να συγχωνεύσουμε και τους δύο πίνακες, το R κάνει ένα σφάλμα. Για να διορθώσουμε την κατάσταση, μπορούμε να περάσουμε δύο μεταβλητές ζευγών κλειδιών. Δηλαδή, το αναγνωριστικό και το έτος που εμφανίζονται και στα δύο σύνολα δεδομένων. Μπορούμε να χρησιμοποιήσουμε τον παρακάτω κώδικα για να συγχωνεύσουμε τον πίνακα 1 και τον πίνακα 2
df_primary <- tribble( ~ID, ~year, ~items, "A", 2015,3, "A", 2016,7, "A", 2017,6, "B", 2015,4, "B", 2016,8, "B", 2017,7, "C", 2015,4, "C", 2016,6, "C", 2017,6) df_secondary <- tribble( ~ID, ~year, ~prices, "A", 2015,9, "A", 2016,8, "A", 2017,12, "B", 2015,13, "B", 2016,14, "B", 2017,6, "C", 2015,15, "C", 2016,15, "C", 2017,13) left_join(df_primary, df_secondary, by = c('ID', 'year'))
Παραγωγή:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
Λειτουργίες καθαρισμού δεδομένων στο R
Ακολουθούν οι τέσσερις σημαντικές λειτουργίες για την τακτοποίηση (καθαρισμό) των δεδομένων:
Λειτουργία | Σκοπός | Επιχειρήματα |
---|---|---|
μαζεύω() | Μετατρέψτε τα δεδομένα από ευρεία σε μακρά | (δεδομένα, κλειδί, τιμή, na.rm = FALSE) |
εξάπλωση() | Μετατρέψτε τα δεδομένα από μακρύ σε μεγάλο | (δεδομένα, κλειδί, τιμή) |
ξεχωριστός() | Διαχωρίστε μια μεταβλητή σε δύο | (δεδομένα, στήλη, σε, sep= "", αφαίρεση = TRUE) |
μονάδα() | Ενώστε δύο μεταβλητές σε μία | (δεδομένα, col, conc ,sep= "", αφαίρεση = TRUE) |
Χρησιμοποιούμε τη βιβλιοθήκη tidyr. Αυτή η βιβλιοθήκη ανήκει στη συλλογή της βιβλιοθήκης για χειρισμό, καθαρισμό και οπτικοποίηση των δεδομένων. Εάν εγκαταστήσουμε το R με anaconda, η βιβλιοθήκη είναι ήδη εγκατεστημένη. Μπορούμε να βρούμε τη βιβλιοθήκη εδώ, https://anaconda.org/r/r-tidyr.
Εάν δεν είναι ήδη εγκατεστημένο, πληκτρολογήστε την ακόλουθη εντολή για να εγκαταστήσετε το tidyr:
install tidyr : install.packages("tidyr")
μαζεύω()
Ο στόχος της συνάρτησης collect() είναι να μετατρέψει τα δεδομένα από ευρεία σε μακρά.
Σύνταξη
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
Παράδειγμα
Παρακάτω, μπορούμε να απεικονίσουμε την έννοια της αναμόρφωσης από πλάτος σε μακρύ. Θέλουμε να δημιουργήσουμε μια ενιαία στήλη με το όνομα ανάπτυξη, που θα συμπληρώνεται από τις σειρές των μεταβλητών του τριμήνου.
library(tidyr) # Create a messy dataset messy <- data.frame( country = c("A", "B", "C"), q1_2017 = c(0.03, 0.05, 0.01), q2_2017 = c(0.05, 0.07, 0.02), q3_2017 = c(0.04, 0.05, 0.01), q4_2017 = c(0.03, 0.02, 0.04)) messy
Παραγωγή:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data tidier <-messy %>% gather(quarter, growth, q1_2017:q4_2017) tidier
Παραγωγή:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
Στη συνάρτηση collect(), δημιουργούμε δύο νέες μεταβλητές τρίμηνο και ανάπτυξη, επειδή το αρχικό μας σύνολο δεδομένων έχει μία μεταβλητή ομάδας: π.χ. χώρα και τα ζεύγη κλειδιού-τιμής.
εξάπλωση()
Η συνάρτηση spread() κάνει το αντίθετο από το collect.
Σύνταξη
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
Παράδειγμα
Μπορούμε να αναδιαμορφώσουμε το πιο τακτοποιημένο σύνολο δεδομένων σε ακατάστατο με spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
Παραγωγή:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
ξεχωριστός()
Η συνάρτηση ξεχωριστή() χωρίζει μια στήλη στα δύο σύμφωνα με ένα διαχωριστικό. Αυτή η συνάρτηση είναι χρήσιμη σε ορισμένες περιπτώσεις όπου η μεταβλητή είναι ημερομηνία. Η ανάλυσή μας μπορεί να απαιτεί εστίαση σε μήνα και έτος και θέλουμε να διαχωρίσουμε τη στήλη σε δύο νέες μεταβλητές.
Σύνταξη
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
Παράδειγμα
Μπορούμε να χωρίσουμε το τρίμηνο από το έτος στο πιο τακτοποιημένο σύνολο δεδομένων εφαρμόζοντας τη συνάρτηση ξεχωριστή().
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
Παραγωγή:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
ενώνω()
Η συνάρτηση unite() συνενώνει δύο στήλες σε μία.
Σύνταξη
unit(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
Παράδειγμα
Στο παραπάνω παράδειγμα, διαχωρίσαμε τρίμηνο από έτος. Τι γίνεται αν θέλουμε να τα συγχωνεύσουμε. Χρησιμοποιούμε τον παρακάτω κώδικα:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
Παραγωγή:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
Σύνοψη
- Ανάλυση δεδομένων μπορεί να χωριστεί σε τρία μέρη: Εξαγωγή, Μετασχηματισμός και Οπτικοποίηση.
- Το R έχει μια βιβλιοθήκη που ονομάζεται dplyr για να βοηθήσει στον μετασχηματισμό δεδομένων. Η βιβλιοθήκη dplyr δημιουργείται βασικά γύρω από τέσσερις λειτουργίες για τον χειρισμό των δεδομένων και πέντε ρήματα για τον καθαρισμό των δεδομένων.
- Το dplyr παρέχει έναν ωραίο και βολικό τρόπο συνδυασμού συνόλων δεδομένων. Μια ένωση με dplyr προσθέτει μεταβλητές στα δεξιά του αρχικού συνόλου δεδομένων.
- Η ομορφιά του dplyr είναι ότι χειρίζεται τέσσερις τύπους ενώσεων παρόμοια με SQL:
- left_join() – Για να συγχωνεύσετε δύο σύνολα δεδομένων και να διατηρήσετε όλες τις παρατηρήσεις από τον πίνακα προέλευσης.
- right_join() – Για να συγχωνεύσετε δύο σύνολα δεδομένων και να διατηρήσετε όλες τις παρατηρήσεις από τον πίνακα προορισμού.
- εσωτερική σύνδεση() – Για να συγχωνεύσετε δύο σύνολα δεδομένων και να εξαιρέσετε όλες τις μη αντιστοιχισμένες σειρές.
- full_join() – Για να συγχωνεύσετε δύο σύνολα δεδομένων και να διατηρήσετε όλες τις παρατηρήσεις.
- Χρησιμοποιώντας τη βιβλιοθήκη tidyr, μπορείτε να μετατρέψετε ένα σύνολο δεδομένων χρησιμοποιώντας τις ακόλουθες λειτουργίες:
- μαζεύω(): Μετατρέψτε τα δεδομένα από ευρεία σε μακρά.
- εξάπλωση(): Μετατρέψτε τα δεδομένα από μακρύ σε μεγάλο.
- ξεχωριστός(): Διαχωρίστε μια μεταβλητή σε δύο.
- μονάδα(): Ενώστε δύο μεταβλητές σε μία.