Πώς να ταξινομήσετε ένα πλαίσιο δεδομένων με βάση πολλαπλές στήλες

Θέλω να ταξινομήσω ένα data.frame με βάση πολλαπλές στήλες. Για παράδειγμα, με το παρακάτω πλαίσιο data.frame θα ήθελα να ταξινομήσω με βάση τη στήλη "z" (φθίνουσα) και στη συνέχεια με βάση τη στήλη "b" (αύξουσα):

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
dd
    b x y z
1  Hi A 8 1
2 Med D 3 1
3  Hi A 9 1
4 Low C 9 2
Λύση

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση order() απευθείας χωρίς να καταφύγετε σε πρόσθετα εργαλεία -- δείτε αυτή την απλούστερη απάντηση που χρησιμοποιεί ένα τέχνασμα ακριβώς από την κορυφή του κώδικα example(order):

R> dd[with(dd, order(-z, b)), ]
    b x y z
4 Low C 9 2
2 Med D 3 1
1  Hi A 8 1
3  Hi A 9 1

Επεξεργασία περίπου 2+ χρόνια αργότερα: Μόλις ρωτήθηκε πώς να το κάνετε αυτό με βάση τον δείκτη στήλης. Η απάντηση είναι απλά να περάσετε την επιθυμητή(ες) στήλη(ες) ταξινόμησης στη συνάρτηση order():

R> dd[order(-dd[,4], dd[,1]), ]
    b x y z
4 Low C 9 2
2 Med D 3 1
1  Hi A 8 1
3  Hi A 9 1
R> 

αντί να χρησιμοποιείτε το όνομα της στήλης (και την with() για ευκολότερη/πιο άμεση πρόσβαση).

Σχόλια (10)

Με αυτή την (πολύ χρήσιμη) συνάρτηση του Kevin Wright, που δημοσιεύτηκε στην ενότητα συμβουλές του R wiki, αυτό επιτυγχάνεται εύκολα.

sort(dd,by = ~ -z + b)
#     b x y z
# 4 Low C 9 2
# 2 Med D 3 1
# 1  Hi A 8 1
# 3  Hi A 9 1
Σχόλια (1)

Εναλλακτικά, χρησιμοποιώντας το πακέτο Deducer


library(Deducer)
dd
Σχόλια (0)