R Select(), Filter(), Arrange(), Pipeline with Example
⚡ Έξυπνη Σύνοψη
Οι επιλογές, το φιλτράρισμα και η διάταξη στην R είναι τα τρία ρήματα dplyr που ανάγουν ένα πλαίσιο δεδομένων στις στήλες, τις γραμμές και τη σειρά που χρειάζεστε. Αυτή η αναλυτική παρουσίαση τα συνδέει με τον τελεστή pipe σε ένα σύνολο δεδομένων χρόνων διαδρομής 205 γραμμών.
Τι είναι το dplyr στην R;
dplyr είναι το πακέτο χειρισμού δεδομένων του tidyverse. Αντικαθιστά τη σημειογραφία βάσης σε παρένθεση R με ένα μικρό σύνολο ρημάτων, καθένα από τα οποία ονομάζεται από την ενέργεια που εκτελεί και το καθένα λαμβάνει το πλαίσιο δεδομένων ως πρώτο όρισμά του. Αυτό το συνεπές σχήμα είναι που επιτρέπει στα ρήματα να συνδέονται αλυσιδωτά.
| Ρήμα | Πράξεις σε | Τι κάνει |
|---|---|---|
| επιλέγω() | Στήλες | Διατηρεί ή απορρίπτει μεταβλητές |
| φίλτρο() | Γραμμές | Διατηρεί τις γραμμές που ταιριάζουν με μια συνθήκη |
| κανονίζω() | Γραμμές | Αναδιάταξη γραμμών κατά μία ή περισσότερες στήλες |
| αλλάσσω() | Στήλες | Δημιουργεί ή τροποποιεί μια μεταβλητή |
| συνοψίζω() | Ολόκληρο το τραπέζι | Συμπτύσσει πολλές γραμμές σε ένα μόνο στατιστικό στοιχείο |
| group_by() | Ολόκληρο το τραπέζι | Διαχωρίζει τα δεδομένα έτσι ώστε τα ρήματα αργότερα να εκτελούνται ανά ομάδα |
Αυτό το σεμινάριο καλύπτει τα τρία πρώτα ρήματα συν τον σωλήνα. εκπαιδευτικό σεμινάριο συνάρτησης συγκεντρωτικών αποτελεσμάτων Καλύπτει σε βάθος τις συναρτήσεις group_by() και summarize().
Σύνολο δεδομένων που χρησιμοποιήθηκε σε αυτό το σεμινάριο
Η βιβλιοθήκη που ονομάζεται dplyr περιέχει πολύτιμα ρήματα για πλοήγηση μέσα στο σύνολο δεδομένων. Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το σύνολο δεδομένων Χρόνοι μετακίνησης. Το σύνολο δεδομένων καταγράφει τα ταξίδια που κάνει ένας οδηγός μεταξύ σπιτιού και χώρου εργασίας. Υπάρχουν δεκατέσσερις μεταβλητές στο σύνολο δεδομένων, όπως:
- DayOfWeek: Προσδιορίστε την ημέρα της εβδομάδας που ο οδηγός χρησιμοποιεί το αυτοκίνητό του
- Απόσταση: Η συνολική απόσταση του ταξιδιού
- MaxSpeed: Η μέγιστη ταχύτητα του ταξιδιού
- TotalTime: Η διάρκεια σε λεπτά του ταξιδιού
Το σύνολο δεδομένων περιέχει 205 παρατηρήσεις και οι βόλτες πραγματοποιήθηκαν από Monday έως την Παρασκευή.
Πρώτα απ 'όλα, πρέπει να:
- φορτώστε το σύνολο δεδομένων
- ελέγξτε τη δομή των δεδομένων.
Μια εύχρηστη συνάρτηση dplyr είναι η glimpse(). Παίζει τον ίδιο ρόλο με την str() της βάσης R, αλλά εκτυπώνει μία γραμμή ανά μεταβλητή με τον τύπο και τις πρώτες τιμές, κάτι που είναι πολύ πιο εύκολο να σαρωθεί σε ένα ευρύ σύνολο δεδομένων.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Παραγωγή:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
Η μεταβλητή Σχόλια χρειάζεται σαφώς μια πιο προσεκτική ματιά: οι πρώτες παρατηρήσεις είναι όλες κενές.
sum(df$Comments =="")
Code εξήγηση
- sum(df$Comments == “”): Μετράει τις παρατηρήσεις που ισούται με μια κενή συμβολοσειρά στη στήλη Σχόλια του df
Παραγωγή:
## [1] 181
Με τα δεδομένα φορτωμένα, ξεκινήστε με το ρήμα που περικόπτει τις στήλες.
επιλέγω()
Θα ξεκινήσουμε με το ρήμα select(). Δεν χρειαζόμαστε απαραίτητα όλες τις μεταβλητές και μια καλή πρακτική είναι να επιλέγουμε μόνο τις μεταβλητές που θεωρείτε σχετικές.
Έχουμε 181 ελλείπουσες παρατηρήσεις, σχεδόν το 90 τοις εκατό του συνόλου δεδομένων. Εάν αποφασίσετε να τα εξαιρέσετε, δεν θα μπορείτε να συνεχίσετε την ανάλυση.
Η άλλη δυνατότητα είναι να απορρίψετε τη μεταβλητή Comment με το ρήμα select().
Μπορούμε να επιλέξουμε μεταβλητές με διαφορετικούς τρόπους με το select(). Σημειώστε ότι το πρώτο όρισμα είναι το σύνολο δεδομένων.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Μπορείτε να χρησιμοποιήσετε τον τρίτο τρόπο για να εξαιρέσετε τη μεταβλητή Σχόλια.
step_1_df <- select(df, -Comments) dim(df)
Παραγωγή:
## [1] 205 14
dim(step_1_df)
Παραγωγή:
## [1] 205 13
Το αρχικό σύνολο δεδομένων έχει 14 χαρακτηριστικά ενώ το step_1_df έχει 13.
Βοηθητικές συναρτήσεις select() στην R
Η ονομασία κάθε στήλης καθίσταται μη πρακτική όταν ένα σύνολο δεδομένων έχει δεκάδες μεταβλητές. Το dplyr συνοδεύεται από βοηθούς που επιλέγουν στήλες κατά μοτίβο ή κατά τύπο.
| Βοηθός | Επιλέγει στήλες που | Παράδειγμα |
|---|---|---|
| ξεκινά_με() | Ξεκινήστε με μια συμβολοσειρά | select(df, starts_with(“Μέσος όρος”)) |
| τελειώνει_με() | Τερματίστε με μια συμβολοσειρά | select(df, ends_with(“Ώρα”)) |
| περιέχει() | Περιέχει μια συμβολοσειρά οπουδήποτε | select(df, περιέχει("Ταχύτητα")) |
| ταιριάζει () | Αντιστοίχιση κανονικής έκφρασης | επιλέξτε(df, ταιριάζει με("^Μέγιστο|^Μέσο όρο")) |
| όπου() | Ολοκλήρωση δοκιμής τύπου | επιλέξτε(df, όπου(είναι.αριθμητικό)) |
| πάντα() | Δεν έχουν ονομαστεί ακόμα | select(df, Συνολικός Χρόνος, όλα()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
Δύο ακόμη ρήματα συνδυάζονται φυσικά με την select(). Χρησιμοποιήστε το rename(new_name = old_name) για να αλλάξετε την ονομασία μιας στήλης χωρίς να την αποθέσετε.ping τα άλλα, και relocate() για να μετακινήσετε στήλες χωρίς να τις καταχωρίσετε όλες.
φίλτρο()
Το ρήμα filter() διατηρεί τις παρατηρήσεις που ικανοποιούν μια συνθήκη. Το filter() λειτουργεί ακριβώς όπως το select(), περνάτε πρώτα το πλαίσιο δεδομένων και στη συνέχεια μια συνθήκη που χωρίζεται με κόμμα:
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Ένα κριτήριο
Πρώτα απ 'όλα, μπορείτε να μετρήσετε τον αριθμό των παρατηρήσεων σε κάθε επίπεδο μιας μεταβλητής παράγοντα.
table(step_1_df$GoingTo)
Code εξήγηση
- table(): Μετράει τον αριθμό των παρατηρήσεων ανά επίπεδο. Αναμένει μια μεταβλητή παράγοντα ή χαρακτήρα
- table(step_1_df$GoingTo): Μετράει τον αριθμό των ταξιδιών προς κάθε προορισμό
Παραγωγή:
## ## GSK Home ## 105 100
Ο πίνακας συναρτήσεων() υποδεικνύει ότι 105 βόλτες πηγαίνουν στο GSK και 100 στο Home.
Μπορούμε να φιλτράρουμε τα δεδομένα για να επιστρέψουμε ένα σύνολο δεδομένων με 105 παρατηρήσεις και ένα άλλο με 100 παρατηρήσεις.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Παραγωγή:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Παραγωγή:
## [1] 105 14
Πολλαπλά κριτήρια
Μπορούμε να φιλτράρουμε ένα σύνολο δεδομένων με περισσότερα από ένα κριτήρια. Για παράδειγμα, μπορείτε π.χ.tracτις παρατηρήσεις όπου ο προορισμός είναι η έδρα και το ταξίδι πραγματοποιήθηκε Τετάρτη.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Παραγωγή:
## [1] 23 14
23 παρατηρήσεις ταιριάζουν με αυτό το κριτήριο.
Συνθήκες και κοινά φίλτρα() Operators στο R
Η συνάρτηση filter() διατηρεί κάθε γραμμή για την οποία η συνθήκη αξιολογείται ως TRUE. Οι γραμμές που αξιολογούνται ως NA παραλείπονται, κάτι που εκπλήσσει τους περισσότερους αρχάριους.
| OperaTor | Νόημα | Παράδειγμα |
|---|---|---|
| == | Ισο με | φίλτρο(df, Μετάβαση σε == “Αρχική”) |
| != | Οχι ίσο με | φίλτρο(df, ΗμέραΕβδομάδας!="Monday") |
| & | ΚΑΙ, και τα δύο πρέπει να ισχύουν | φίλτρο (df, Απόσταση > 50 & Μέγιστη ταχύτητα > 130) |
| | | Ή, μπορεί να ισχύει οποιοδήποτε από τα δύο | φίλτρο(df, ΗμέραΕβδομάδας == "Monday” | ΗμέραΕβδομάδας == “Παρασκευή”) |
| %σε% | Αντιστοιχεί σε οποιαδήποτε τιμή σε ένα διάνυσμα | φίλτρο(df, ΗμέραΕβδομάδας %in% c("Monday», «Παρασκευή»)) |
| μεταξύ() | Εμπίπτει σε ένα αριθμητικό εύρος | φίλτρο(df, μεταξύ(Απόσταση, 48, 52)) |
| is.na() | Είναι μια τιμή που λείπει | φίλτρο(df, is.na(Οικονομία Καυσίμου)) |
Τρεις συνήθειες αποτρέπουν τα περισσότερα σφάλματα filter().
- Χρησιμοποιήστε %in% αντί για αλυσιδωτό OR. φίλτρο(df, ΗμέραΕβδομάδας %in% c("Monday», «Παρασκευή»)) είναι συντομότερο και πολύ πιο δύσκολο να πληκτρολογηθεί λάθος από δύο == συγκρίσεις που ενώνονται με μια κάθετη γραμμή.
- Ποτέ μην ελέγχετε μια τιμή που λείπει με ==. Η έκφραση x == NA επιστρέφει NA, όχι TRUE, επομένως η γραμμή απορρίπτεται σιωπηλά. Χρησιμοποιήστε αντί αυτού is.na(x).
- Τα κόμματα σημαίνουν ΚΑΙ. Η συνάρτηση filter(df, a, b) είναι πανομοιότυπη με την συνάρτηση filter(df, a & b), γι' αυτό και το παράδειγμα που αναφέρθηκε νωρίτερα σε αυτό το σεμινάριο λειτουργεί με οποιονδήποτε τρόπο.
Ο Σωλήνας Operator σε dplyr
Η δημιουργία ενός συνόλου δεδομένων απαιτεί πολλές λειτουργίες, όπως:
- εισαγωγή
- συγχώνευση
- επιλογή
- φιλτράρισμα
- και ούτω καθεξής
Η βιβλιοθήκη dplyr συνοδεύεται από έναν πρακτικό τελεστή, %>%, που ονομάζεται the σωλήναςΚάνει τον χειρισμό δεδομένων πιο καθαρό, ταχύτερο και λιγότερο επιρρεπή σε σφάλματα.
Αυτός ο τελεστής είναι ένας κωδικός που εκτελεί βήματα χωρίς να αποθηκεύει ενδιάμεσα βήματα στον σκληρό δίσκο. Εάν επιστρέψετε στο παράδειγμά μας από παραπάνω, μπορείτε να επιλέξετε τις μεταβλητές που σας ενδιαφέρουν και να τις φιλτράρετε. Έχουμε τρία βήματα:
- Βήμα 1: Εισαγωγή δεδομένων: Εισαγάγετε τα δεδομένα gps
- Βήμα 2: Επιλογή δεδομένων: Επιλέξτε GoingTo και DayOfWeek
- Βήμα 3: Φιλτράρισμα δεδομένων: Επιστροφή μόνο στο σπίτι και Τετάρτη
Μπορούμε να χρησιμοποιήσουμε τον δύσκολο τρόπο για να το κάνουμε:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Παραγωγή:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Αυτός δεν είναι ένας βολικός τρόπος για να συνδέσετε πολλές λειτουργίες σε μια αλυσίδα. Κάθε ενδιάμεσο αποτέλεσμα παραμένει στο περιβάλλον και τα ονόματα παύουν γρήγορα να έχουν οποιαδήποτε σημασία.
Χρησιμοποιήστε τον τελεστή pipe %>% αντί αυτού. Ονομάζετε το πλαίσιο δεδομένων μία φορά στην αρχή και κάθε βήμα ρέει από αυτό.
Βασική σύνταξη του αγωγού
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: the last instruction does not need a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints in the console.
Μπορείτε να δημιουργήσετε τον πρώτο σας σωλήνα ακολουθώντας τα βήματα που απαριθμούνται παραπάνω.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) %>% #Step 2 select(GoingTo, DayOfWeek) %>% #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Παραγωγή:
## [1] TRUE
Τα δύο αντικείμενα είναι πανομοιότυπα, επομένως ο αγωγός παρήγαγε ακριβώς το ίδιο αποτέλεσμα σε μία μόνο αναγνώσιμη πρόταση.
κανονίζω()
Στο προηγούμενο σεμινάριο, μαθαίνετε πώς να ταξινομείτε τις τιμές με τη συνάρτηση sort(). Η βιβλιοθήκη dplyr έχει τη λειτουργία ταξινόμησης. Λειτουργεί σαν γούρι με τον αγωγό. Το ρήμα arrange() μπορεί να αναδιατάξει μία ή πολλές σειρές, είτε αύξουσα (προεπιλογή) είτε φθίνουσα.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Μπορούμε να ταξινομήσουμε την απόσταση ανά προορισμό.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Παραγωγή:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
dplyr Ρήματα στο R: Γρήγορη Αναφορά
Ο παρακάτω πίνακας παραθέτει κάθε ρήμα που χρησιμοποιείται σε αυτό το σεμινάριο, με τη σύνταξη και τι επιστρέφει κάθε κλήση:
| Ρήμα | Σκοπός | Code | εξήγηση |
|---|---|---|---|
| ματιά | ελέγξτε τη δομή ενός df |
glimpse(df)
|
Ίδιος σκοπός με το str(), πιο εύκολο στην ανάγνωση |
| επιλέγω() | Επιλέξτε/εξαιρέστε τις μεταβλητές |
select(df, A, B ,C)
|
Επιλέξτε τις μεταβλητές A, B και C |
select(df, A:C)
|
Επιλέξτε όλες τις μεταβλητές από το A έως το C | ||
select(df, -C)
|
Εξαιρέστε το C | ||
| φίλτρο() | Διατηρήστε τις γραμμές που αντιστοιχούν σε μία ή περισσότερες συνθήκες |
filter(df, condition1)
|
Μία προϋπόθεση |
filter(df, condition1 & condition2)
|
Δύο συνθήκες σε συνδυασμό με ΚΑΙ | ||
| κανονίζω() | Ταξινομήστε το σύνολο δεδομένων με μία ή πολλές μεταβλητές |
arrange(A)
|
Αύξουσα μορφή μεταβλητής Α |
arrange(A, B)
|
Αύξουσα μορφή μεταβλητών Α και Β | ||
arrange(desc(A), B)
|
Φθίνουσα ταξινόμηση της μεταβλητής Α και αύξουσα ταξινόμηση της μεταβλητής Β | ||
| %>% | Δημιουργήστε έναν αγωγό μεταξύ κάθε βήματος |
step 1 %>% step 2 %>% step 3 |

