Cadrul de date de sortare R: funcția order() cu exemplu
⚡ Rezumat inteligent
Sortarea unui cadru de date în R se bazează pe funcția order(), care returnează pozițiile rândurilor în loc de valori. Transmiterea acestor poziții între paranteze pătrate rearanjează rândurile cu o coloană, cu mai multe coloane sau în ordine descrescătoare.

Sortarea datelor în R
În analiza datelor puteți fel datele dvs. conform unei anumite variabile din setul de date. În R, putem folosi ajutorul funcției order(). În R, putem sorta cu ușurință un vector de variabilă continuă sau variabilă factor. Aranjarea datelor poate fi de ascendent or Descendentă comandă.
Sintaxă:
sort(x, decreasing = FALSE, na.last = NA)
Argument:
- xUn vector care conține o variabilă continuă sau factorială
- scădereControlează direcția sortării. În mod implicit, descreșterea este setată la FALSE, ceea ce oferă o ordine crescătoare.
- na.lastIndică dacă valorile NA ar trebui plasate ultimele sau nu. sort() folosește NA în mod implicit, ceea ce elimină valorile lipsă; order() folosește TRUE, ceea ce le păstrează și le plasează ultimele.
sort() vs order() vs rank() în R
Sintaxa de mai sus aparține funcției sort(), însă fiecare exemplu de pe această pagină apelează order(). Cele două funcții răspund la întrebări diferite, iar amestecarea lor este cel mai frecvent motiv pentru care o sortare pare să eșueze. rank() completează trioul.
| Funcţie | Returnări | Folosește-l când | Gestionare implicită NA |
|---|---|---|---|
| fel() | Valorile în sine, pentru a | Ai nevoie doar de un vector sortat | na.last = NA, deci NA este eliminat |
| comanda() | Pozițiile rândurilor care produc ordinea de sortare | Trebuie să reordonați un întreg cadru de date | na.last = TRUE, deci NA merge ultimul |
| rang() | Rangul fiecărui element în poziția sa inițială | Ai nevoie de o coloană de clasament, nu de un tabel reordonat | na.last = TRUE |
Deoarece order() returnează poziții, este singura dintre cele trei care poate controla subsetarea parantezei drepte utilizată pe parcursul acestei pagini. Documentația de bază R pentru order() listează fiecare argument, inclusiv argumentul metodei care selectează algoritmul de sortare.
Exemplul 1: Sortarea unui cadru de date după o coloană
De exemplu, putem crea un cadru de date tibble și putem sorta una sau mai multe variabile. Un cadru de date tibble este o abordare modernă a cadru de dateÎmbunătățește sintaxa cadrului de date și evită formatarea frustrantă a tipurilor de date, în special conversia de la caracter la factor. De asemenea, este o modalitate convenabilă de a crea manual un cadru de date, acesta fiind scopul nostru aici. Pentru a afla mai multe despre tibble, vă rugăm să consultați vinieta: https://tibble.tidyverse.org/articles/tibble.html
Codul de mai jos construiește un tibble cu 50 de rânduri și cinci coloane aleatorii și apoi sortează fiecare rând după valorile din c1. set.seed(1234) corectează extragerea aleatorie, astfel încât aceleași numere să apară pe orice mașină.
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)
ieșire:
# 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
Virgula dinaintea parantezei de închidere contează: df[order(…), ] reordonează rândurile, în timp ce df[, order(…)] ar reordona coloanele.
Exemplul 2: Sortare după mai multe coloane
Fiecare argument suplimentar transmis funcției order() acționează ca un factor de departajare pentru argumentul anterior. Aici, cadrul este sortat după c3, iar rândurile care au aceeași valoare c3 sunt apoi ordonate după c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
ieșire:
# 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
Exemplul 3: Sortarea unei coloane în ordine descrescătoare și a alteia în ordine crescătoare
Fiecare coloană poate avea propria direcție. Prefixarea unei coloane numerice cu un semn minus inversează doar acea coloană, astfel încât sortarea de mai jos se execută descrescător pe c3 și crescător pe c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
ieșire:
# 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
Trucul cu semnul minus funcționează doar pe coloanele numerice. Pentru coloanele cu caractere sau factori, folosiți order(xtfrm(df$col), decreasing = TRUE) sau treceți la abordarea dplyr prezentată în continuare.
Sortează un cadru de date cu dplyr arrange()
Idiomul dintre paranteze pătrate devine greu de citit odată ce sunt implicate mai multe coloane și direcții, deoarece numele cadrului se repetă în interiorul fiecărui argument. dplyr Verbul arrange() elimină acea repetiție: coloanele sunt denumite o singură dată, iar desc() le marchează pe cele care rulează invers.
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
Trei diferențe practice merită cunoscute:
- Diviziune: arrange(desc(c3), c4) afirmă intenția direct, în timp ce order(-data_frame$c3, data_frame$c4) o ascunde în spatele unui semn minus.
- Tipuri de coloanedesc() funcționează atât pe coloanele de caractere și factori, cât și pe cele numerice, deci nu este necesară o soluție alternativă pentru xtfrm().
- Valori lipsă: arrange() plasează întotdeauna NA pe ultimul loc, indiferent de direcție, în timp ce order() vă permite să le mutați cu na.last.
Funcția arrange() returnează un nou cadru de date și lasă originalul neatins, exact ca în versiunea cu paranteze drepte, deci rezultatul trebuie totuși să fie atribuit unui nume pentru a fi păstrat. Cadrele grupate sunt sortate în cadrul fiecărui grup numai atunci când se furnizează .by_group = TRUE.
Sortarea caracterelor, factorilor și valorilor lipsă în R
Coloanele numerice sortează previzibil. Textul, categoriile și spațiile libere nu, iar fiecare dintre cele trei necesită o decizie diferită.
Valori lipsă. sort() și order() nu sunt de acord în privința modului în care funcționează cu NA, motiv pentru care aceeași coloană poate produce două numărări diferite de rânduri:
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
factori. A factor sortează după ordinea nivelului, nu alfabetic. Exact asta doriți pentru categoriile ordonate, cum ar fi scăzut, mediu și ridicat, și exact asta nu doriți dacă nivelurile au fost create în ordinea în care au apărut valorile:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Coloane de caractere. Textul simplu sortează după colaționarea regională, astfel încât majusculele și accentele pot schimba rezultatul între mașini. Două obiceiuri evită surprizele: verificați class(df$col) înainte de sortare și convertiți cifrele stocate ca text cu as.numeric() astfel încât „10” să nu apară înainte de „2”.
