Πλαίσιο δεδομένων ταξινόμησης R: συνάρτηση order() με παράδειγμα

⚡ Έξυπνη Σύνοψη

Η ταξινόμηση ενός πλαισίου δεδομένων στο R βασίζεται στη συνάρτηση order(), η οποία επιστρέφει θέσεις γραμμών αντί για τιμές. Η μεταφορά αυτών των θέσεων μέσα σε αγκύλες αναδιατάσσει τις γραμμές κατά μία στήλη, κατά πολλές στήλες ή σε φθίνουσα σειρά.

  • 🔢 Βασικά στοιχεία order(): Η συνάρτηση order() επιστρέφει τους δείκτες γραμμών που τοποθετούν μια στήλη σε αύξουσα ακολουθία, όχι τις ίδιες τις ταξινομημένες τιμές.
  • 📌 Μονή στήλη: Η συνάρτηση df[order(df$c1), ] αναδιατάσσει κάθε γραμμή του πλαισίου κατά τις τιμές που περιέχονται στο c1.
  • 🧮 Πολλαπλές στήλες: Επιπλέον ορίσματα λειτουργούν ως διαχωριστικά ισοπαλίας, επομένως τα order(df$c3, df$c4) ταξινομούνται κατά c3 και στη συνέχεια κατά c4.
  • 🔻 Φθίνουσα σειρά: Προσθήκη προθέματος σε μια αριθμητική στήλη με το σύμβολο μείον ή εισαγωγή της μειούμενης = TRUE για ταξινόμηση().
  • 🧩 Διαδρομή tidyverse: Οι arrange() και desc() εκφράζουν ακριβώς τους ίδιους τύπους με τα αναγνώσιμα ρήματα dplyr.
  • ⚠️ Τιμές που λείπουν: Η συνάρτηση order() τοποθετεί το NA τελευταίο από προεπιλογή, ενώ η συνάρτηση sort() αφαιρεί τις τιμές που λείπουν, εκτός εάν έχει οριστεί η συνάρτηση na.last.

R Ταξινόμηση ενός πλαισίου δεδομένων χρησιμοποιώντας Order()

Ταξινόμηση Δεδομένων σε R

Στην ανάλυση δεδομένων μπορείτε είδος τα δεδομένα σας σύμφωνα με μια συγκεκριμένη μεταβλητή στο σύνολο δεδομένων. Στο R, μπορούμε να χρησιμοποιήσουμε τη βοήθεια της συνάρτησης order(). Στο R, μπορούμε εύκολα να ταξινομήσουμε ένα διάνυσμα συνεχούς μεταβλητής ή μεταβλητής παράγοντα. Η τακτοποίηση των δεδομένων μπορεί να είναι από αύξουσα or φθίνων παραγγελία.

Σύνταξη:

sort(x, decreasing = FALSE, na.last = NA)

Διαφωνία:

  • x: Ένα διάνυσμα που περιέχει μια συνεχή ή παραγοντική μεταβλητή
  • φθίνουσαΕλέγχει την κατεύθυνση της ταξινόμησης. Από προεπιλογή, η φθίνουσα ρύθμιση έχει οριστεί σε FALSE, η οποία δίνει αύξουσα σειρά.
  • να.τελευταίοΗ συνάρτηση sort() χρησιμοποιεί την συνάρτηση NA από προεπιλογή, η οποία διαγράφει τις τιμές που λείπουν. Η συνάρτηση order() χρησιμοποιεί την συνάρτηση TRUE, η οποία τις διατηρεί και τις τοποθετεί τελευταίες.

sort() vs order() vs rank() στην R

Η παραπάνω σύνταξη ανήκει στην sort(), ωστόσο κάθε παράδειγμα σε αυτήν τη σελίδα καλεί την order(). Οι δύο συναρτήσεις απαντούν σε διαφορετικές ερωτήσεις και η ανάμειξή τους είναι ο πιο συνηθισμένος λόγος που μια ταξινόμηση φαίνεται να αποτυγχάνει. Η rank() ολοκληρώνει την τριάδα.

Λειτουργία Επιστροφές Χρησιμοποιήστε το όταν Προεπιλεγμένος χειρισμός NA
είδος() Οι ίδιες οι αξίες, κατά σειρά Χρειάζεστε μόνο ένα ταξινομημένο διάνυσμα na.last = NA, άρα το NA απορρίπτεται
παραγγελία() Οι θέσεις γραμμών που παράγουν την ταξινομημένη σειρά Πρέπει να αναδιατάξετε ένα ολόκληρο πλαίσιο δεδομένων na.last = TRUE, άρα το NA μπαίνει τελευταίο
τάξη() Η κατάταξη κάθε στοιχείου στην αρχική του θέση Χρειάζεστε μια στήλη κατάταξης, όχι έναν αναδιατεταγμένο πίνακα na.last = TRUE

Επειδή η συνάρτηση order() επιστρέφει θέσεις, είναι η μόνη από τις τρεις που μπορεί να οδηγήσει το υποσύνολο αγκυλών που χρησιμοποιείται σε όλη αυτήν τη σελίδα. Βασική τεκμηρίωση R για order() παραθέτει κάθε όρισμα, συμπεριλαμβανομένου του ορίσματος μεθόδου που επιλέγει τον αλγόριθμο ταξινόμησης.

Παράδειγμα 1: Ταξινόμηση ενός πλαισίου δεδομένων κατά μία στήλη

Για παράδειγμα, μπορούμε να δημιουργήσουμε ένα πλαίσιο δεδομένων tibble και να ταξινομήσουμε μία ή περισσότερες μεταβλητές. Ένα πλαίσιο δεδομένων tibble είναι μια σύγχρονη εκδοχή του πλαίσιο δεδομένωνΒελτιώνει τη σύνταξη του πλαισίου δεδομένων και αποφεύγει την ενοχλητική μορφοποίηση τύπων δεδομένων, ειδικά τη μετατροπή από χαρακτήρα σε παράγοντα. Είναι επίσης ένας βολικός τρόπος για να δημιουργήσετε ένα πλαίσιο δεδομένων χειροκίνητα, που είναι και ο σκοπός μας εδώ. Για να μάθετε περισσότερα σχετικά με το tibble, ανατρέξτε στο βινιέτα: https://tibble.tidyverse.org/articles/tibble.html

Ο παρακάτω κώδικας δημιουργεί μια λίστα 50 γραμμών με πέντε τυχαίες στήλες και στη συνέχεια ταξινομεί κάθε γραμμή με βάση τις τιμές στο c1. Η εντολή set.seed(1234) διορθώνει την τυχαία κλήρωση, έτσι ώστε οι ίδιοι αριθμοί να εμφανίζονται σε οποιοδήποτε μηχάνημα.

library(dplyr)
set.seed(1234)
data_frame <- tibble(  
	c1 = rnorm(50, 5, 1.5),   
	c2 = rnorm(50, 5, 1.5),  
	c3 = rnorm(50, 5, 1.5),
	c4 = rnorm(50, 5, 1.5), 	
	c5 = rnorm(50, 5, 1.5)
)
# Sort by c1
df <-data_frame[order(data_frame$c1),]
head(df)

Παραγωγή:

# A tibble: 6 x 5
##       c1       c2       c3       c4       c5
##     <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 1.481453 3.477557 4.246283 3.686611 6.0511003
## 2 1.729941 5.824996 4.525823 6.753663 0.1502718
## 3 2.556360 6.275348 2.524849 6.368483 5.4787404
## 4 2.827693 4.769902 5.120089 3.743626 4.0103449
## 5 2.988510 4.395902 2.077631 4.236894 4.6176880
## 6 3.122021 6.317305 5.413840 3.551145 5.6067027

Το κόμμα πριν από την αγκύλη κλεισίματος έχει σημασία: η συνάρτηση df[order(…), ] αναδιατάσσει τις γραμμές, ενώ η συνάρτηση df[, order(…)] αναδιατάσσει τις στήλες.

Παράδειγμα 2: Ταξινόμηση κατά Πολλαπλές Στήλες

Κάθε επιπλέον όρισμα που περνάει στην order() λειτουργεί ως tie-breaker για το όρισμα που προηγείται αυτού. Εδώ, το πλαίσιο ταξινομείται κατά c3 και οι γραμμές που μοιράζονται την ίδια τιμή c3 ταξινομούνται στη συνέχεια κατά c4.

# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)

Παραγωγή:

# A tibble: 6 x 5
##        c1       c2       c3       c4       c5
##    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 2.988510 4.395902 2.077631 4.236894 4.617688
## 2 2.556360 6.275348 2.524849 6.368483 5.478740
## 3 3.464516 3.914627 2.730068 9.565649 6.016123
## 4 4.233486 3.292088 3.133568 7.517309 4.772395
## 5 3.935840 2.941547 3.242078 6.464048 3.599745
## 6 3.835619 4.947859 3.335349 4.378370 7.240240

Παράδειγμα 3: Ταξινόμηση μίας στήλης κατά φθίνουσα και μίας άλλης κατά αύξουσα

Κάθε στήλη μπορεί να έχει τη δική της κατεύθυνση. Η προσθήκη ενός προθέματος μείον σε μια αριθμητική στήλη αντιστρέφει μόνο αυτήν τη στήλη, επομένως η παρακάτω ταξινόμηση εκτελείται φθίνουσα στο c3 και αύξουσα στο c4.

# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)

Παραγωγή:

# A tibble: 6 x 5
##         c1       c2       c3        c4       c5
##      <dbl>    <dbl>    <dbl>     <dbl>    <dbl>
## 1 4.339178 4.450214 8.087243 4.5010140 8.410225
## 2 3.959420 8.105406 7.736312 7.1168936 5.431565
## 3 3.339023 3.298088 7.494285 5.9303153 7.035912
## 4 3.397036 5.382794 7.092722 0.7163620 5.620098
## 5 6.653446 4.733315 6.520536 0.9016707 4.513410
## 6 4.558559 4.712609 6.380086 6.0562703 5.044277

Το κόλπο με το πρόσημο μείον λειτουργεί μόνο σε αριθμητικές στήλες. Για στήλες χαρακτήρων ή παραγόντων χρησιμοποιήστε την συνάρτηση order(xtfrm(df$col), declining = TRUE) ή μεταβείτε στην προσέγγιση dplyr που φαίνεται στη συνέχεια.

Ταξινόμηση ενός Πλαισίου Δεδομένων με dplyr arrange()

Το ιδίωμα με τις αγκύλες γίνεται δύσκολο να διαβαστεί όταν εμπλέκονται αρκετές στήλες και οδηγίες, επειδή το όνομα του πλαισίου επαναλαμβάνεται μέσα σε κάθε όρισμα. dplyr Η συνάρτηση verb arrange() αφαιρεί αυτήν την επανάληψη: οι στήλες ονομάζονται μία φορά και η συνάρτηση desc() σηματοδοτεί αυτές που εκτελούνται προς τα πίσω.

library(dplyr)
# The same three sorts written with arrange()
data_frame %>% arrange(c1)            # Example 1
data_frame %>% arrange(c3, c4)        # Example 2
data_frame %>% arrange(desc(c3), c4)  # Example 3

Αξίζει να γνωρίζουμε τρεις πρακτικές διαφορές:

  • ευανάγνωστοΗ συνάρτηση arrange(desc(c3), c4) δηλώνει την πρόθεση απευθείας, ενώ η συνάρτηση order(-data_frame$c3, data_frame$c4) την κρύβει πίσω από ένα πρόσημο μείον.
  • Τύποι στηλώνΗ συνάρτηση : desc() λειτουργεί σε στήλες χαρακτήρων και παραγόντων καθώς και σε αριθμητικές στήλες, επομένως δεν απαιτείται λύση xtfrm().
  • Λείπουν τιμέςΗ συνάρτηση arrange() τοποθετεί πάντα την NA τελευταία, ανεξάρτητα από την κατεύθυνση, ενώ η συνάρτηση order() σας επιτρέπει να τις μετακινήσετε με την συνάρτηση na.last.

Η συνάρτηση arrange() επιστρέφει ένα νέο πλαίσιο δεδομένων και αφήνει το αρχικό ανέπαφο, ακριβώς όπως και η έκδοση με αγκύλες, επομένως το αποτέλεσμα πρέπει να αντιστοιχιστεί σε ένα όνομα για να διατηρηθεί. Τα ομαδοποιημένα πλαίσια ταξινομούνται εντός κάθε ομάδας μόνο όταν παρέχεται η συνάρτηση .by_group = TRUE.

Ταξινόμηση χαρακτήρων, παραγόντων και ελλειπουσών τιμών σε R

Οι αριθμητικές στήλες ταξινομούνται προβλέψιμα. Το κείμενο, οι κατηγορίες και τα κενά δεν το κάνουν και για κάθε μία από τις τρεις απαιτείται διαφορετική απόφαση.

Λείπουν τιμές. Οι sort() και order() διαφωνούν ως προς το τι πρέπει να κάνουν με την NA, γι' αυτό και η ίδια στήλη μπορεί να παράγει δύο διαφορετικούς αριθμούς γραμμών:

x <- c(3, NA, 1, 2)
sort(x)                    # missing values dropped
sort(x, na.last = TRUE)    # missing values pushed to the end
order(x)                   # NA indexed last by default
order(x, na.last = FALSE)  # NA indexed first

παράγοντες. A παράγοντας Ταξινομεί κατά σειρά επιπέδου, όχι αλφαβητικά. Αυτό ακριβώς θέλετε για ταξινομημένες κατηγορίες όπως χαμηλό, μεσαίο και υψηλό, και ακριβώς αυτό δεν θέλετε αν τα επίπεδα δημιουργήθηκαν με τη σειρά που εμφανίστηκαν οι τιμές:

grades <- factor(c("low", "high", "medium"),
                 levels = c("low", "medium", "high"))
sort(grades)                # follows the level order
sort(as.character(grades))  # plain alphabetical order

Στήλες χαρακτήρων. Το απλό κείμενο ταξινομείται κατά τοπική ρύθμιση, επομένως η χρήση κεφαλαίων και τόνων μπορεί να αλλάξει το αποτέλεσμα μεταξύ των μηχανών. Δύο συνήθειες αποφεύγουν τις εκπλήξεις: ελέγξτε την κλάση (df$col) πριν από την ταξινόμηση και μετατρέψτε τα ψηφία που είναι αποθηκευμένα ως κείμενο με την as.numeric(), έτσι ώστε το "10" να μην εμφανίζεται πριν από το "2".

Συχνές Ερωτήσεις

Χρησιμοποιήστε τη συνάρτηση df[order(rownames(df)), ]. Τα ονόματα γραμμών είναι χαρακτήρες, επομένως η ταξινόμηση ακολουθεί την ταξινόμηση κειμένου και το "10" καταλήγει πριν από το "2". Τυλίξτε τα σε as.numeric() όταν είναι αριθμητικά. Τα Tibble παραλείπουν εντελώς τα ονόματα γραμμών, επομένως προσθέστε μια ρητή στήλη id.

Μεταβιβάζουμε τη μέθοδο = “radix” στην order(), την ταχύτερη επιλογή για ακέραιους αριθμούς και σύντομες συμβολοσειρές. Για εκατομμύρια γραμμές, η data.table::setorder() ταξινομεί επί τόπου χωρίς να αντιγράφει τον πίνακα και το ρήμα dplyr arrange() χρησιμοποιεί ήδη μια ταξινόμηση με βάση το ρήμα εσωτερικά.

Ευρετήριο με ανεστραμμένη ακολουθία: df[nrow(df):1, ]. Αυτό αντιστρέφει την τρέχουσα σειρά αντί να την ταξινομεί, κάτι που έχει σημασία πότε το πλαίσιο ανακατέυτηκε ή ομαδοποιήθηκε. Επαναφέρετε τις ετικέτες αργότερα με rownames(df) <- NULL εάν φαίνονται περίπλοκες.

Η στήλη αποθηκεύεται ως χαρακτήρας ή παράγοντας, επομένως η R τη συγκρίνει ως κείμενο και τοποθετεί το "10" πριν από το "2". Ελέγξτε με την class(df$col) και, στη συνέχεια, μετατρέψτε τη στήλη χρησιμοποιώντας την as.numeric(as.character(df$col)) πριν την ταξινόμηση.

Η συνάρτηση No.order() επιστρέφει ένα διάνυσμα ευρετηρίου και η συνάρτηση df[order(…), ] δημιουργεί ένα νέο πλαίσιο, έτσι ώστε το αρχικό να παραμένει ανέπαφο μέχρι να αντιστοιχιστεί ξανά το αποτέλεσμα. Τα ονόματα των γραμμών διατηρούν τις παλιές τους τιμές, κάτι που αποτελεί χρήσιμη ένδειξη ότι το πλαίσιο αναδιατάχθηκε.

Οι βοηθοί τεχνητής νοημοσύνης μπορούν να εντοπίσουν μια στήλη που είναι αποθηκευμένη ως κείμενο όταν μια αριθμητική ταξινόμηση φαίνεται λανθασμένη, να μεταφράσουν μια κλήση βάσης R order() σε μια διοχέτευση dplyr και να προτείνουν μια σταθερή στήλη που σπάει την ισοπαλία. Πάντα να εκτελείτε τον κώδικα και να ελέγχετε την head() πριν εμπιστευτείτε το αποτέλεσμα.

Ναί. GitHub Copilot Λειτουργεί σε RStudio Desktop 2023.09.0 και νεότερες εκδόσεις και ολοκληρώνει τις κλήσεις order() και arrange() από ένα απλό σχόλιο. Το Posit προειδοποιεί ότι οι προτάσεις δεν είναι ντετερμινιστικές, επομένως ελέγξτε κάθε γραμμή πριν την εκτελέσετε.

Αναδιάταξη του ευρετηρίου στηλών αντί για το ευρετήριο γραμμών. Η συνάρτηση df[, order(names(df))] ταξινομεί τις στήλες αλφαβητικά και η συνάρτηση df[, c(“c3”, “c1”)] επιλέγει μια σαφή σειρά. Οι χρήστες του dplyr μπορούν να καλέσουν την συνάρτηση select(df, c3, c1), η οποία αναδιατάσσει και υποσύνολα σε ένα βήμα.

Συνοψίστε αυτήν την ανάρτηση με: