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.

  • 🔢 Noțiuni de bază despre order(): Funcția order() returnează indicii rândurilor care plasează o coloană în secvență crescătoare, nu valorile sortate în sine.
  • 📌 Coloană unică: df[order(df$c1), ] rearanjează fiecare rând al cadrului după valorile conținute în c1.
  • 🧮 Coloane multiple: Argumentele suplimentare acționează ca criterii de departajare, așa că order(df$c3, df$c4) sortează după c3 și apoi după c4.
  • 🔻 Ordine descrescatoare: Prefixați o coloană numerică cu un semn minus sau transmiteți decreasing = TRUE către sort().
  • 🧩 Ruta tidyverse: arrange() și desc() exprimă exact aceleași sortări ca și verbele dplyr lizibile.
  • ⚠️ Valori lipsă: În mod implicit, order() plasează NA pe ultimul loc, în timp ce sort() elimină valorile lipsă, cu excepția cazului în care na.last este setat.

R Sortați un cadru de date folosind Order()

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”.

Întrebări frecvente

Folosește df[order(rownames(df)), ]. Numele rândurilor sunt formate din caractere, deci sortarea urmează aranjarea textului, iar „10” apare înainte de „2”. Încadrează-le în as.numeric() când sunt numerice. Tibble elimină complet numele rândurilor, deci adaugă în schimb o coloană cu ID explicit.

Transmiteți metoda = „radix” către order(), cea mai rapidă opțiune pentru numere întregi și șiruri scurte. Pentru milioane de rânduri, data.table::setorder() sortează pe loc fără a copia tabelul, iar verbul dplyr arrange() folosește deja intern o sortare radix.

Index cu o secvență inversată: df[nrow(df):1, ]. Aceasta inversează ordinea curentă în loc să o sorteze, ceea ce contează atunci când cadrul a fost amestecat sau grupat. Resetați etichetele ulterior cu rownames(df) <- NULL dacă par confuze.

Coloana este stocată ca și caracter sau factor, așa că R o compară ca text și pune „10” înainte de „2”. Verificați cu class(df$col), apoi convertiți folosind as.numeric(as.character(df$col)) înainte de a ordona.

Nu. order() returnează un vector index, iar df[order(…), ] construiește un nou cadru, astfel încât originalul să rămână neatins până când rezultatul este atribuit înapoi. Numele rândurilor își păstrează vechile valori, ceea ce este un indiciu util că cadrul a fost reordonat.

Asistenții inteligenți artificiali pot identifica o coloană stocată ca text atunci când o sortare numerică pare greșită, pot traduce un apel order() de bază R într-un pipeline dplyr și pot sugera o coloană stabilă de departajare. Rulați întotdeauna codul și inspectați head() înainte de a avea încredere în rezultat.

Da. Copilotul GitHub Funcționează în RStudio Desktop 2023.09.0 și versiuni ulterioare și completează apelurile order() și arrange() dintr-un comentariu simplu. Posit avertizează că sugestiile nu sunt deterministe, așadar verificați fiecare linie înainte de a o rula.

Reordonează indexul coloanei în loc de indexul rândului. df[, order(names(df))] aranjează coloanele alfabetic, iar df[, c(“c3”, “c1”)] alege o ordine explicită. Utilizatorii dplyr pot apela select(df, c3, c1), care reordonează și subsetează într-un singur pas.

Rezumați această postare cu: