R Sort Data Frame: Funkce order() s příkladem
⚡ Chytré shrnutí
Řazení datového rámce v R se spoléhá na funkci order(), která vrací pozice řádků, nikoli hodnoty. Předání těchto pozic do hranatých závorek přeskupí řádky o jeden sloupec, o několik sloupců nebo sestupně.

Řazení dat v R
V analýze dat můžete druh vaše data podle určité proměnné v datové sadě. V R můžeme použít nápovědu funkce order(). V R můžeme snadno seřadit vektor spojité proměnné nebo faktorové proměnné. Uspořádání dat může být z vzestupně or klesající pořadí.
Syntaxe:
sort(x, decreasing = FALSE, na.last = NA)
Argument:
- xVektor obsahující spojitou nebo faktorizovanou proměnnou
- klesající: Řídí směr řazení. Ve výchozím nastavení je sestupné nastavení nastaveno na NEPRAVDA, což dává vzestupné pořadí.
- na.last: Určuje, zda mají být hodnoty NA umístěny jako poslední, či nikoli. sort() standardně používá NA, což chybějící hodnoty vynechává; order() používá TRUE, což je ponechává a umisťuje je jako poslední.
sort() vs. order() vs. rank() v R
Výše uvedená syntaxe patří k metodě sort(), ale každý příklad na této stránce volá order(). Tyto dvě funkce odpovídají na různé otázky a jejich záměna je nejčastějším důvodem, proč se zdá, že třídění selhává. Trio doplňuje metoda rank().
| funkce | Vrácení zboží | Použijte to, když | Výchozí zpracování NA |
|---|---|---|---|
| řadit () | Samotné hodnoty, aby | Potřebujete pouze seřazený vektor | na.last = NA, takže NA odpadá |
| objednávka() | Pozice řádků, které vytvářejí seřazené pořadí | Potřebujete změnit pořadí celého datového rámce | na.last = TRUE, takže NA je poslední |
| pořadí() | Hodnost každého prvku v jeho původní pozici | Potřebujete sloupec s hodnocením, ne přeskupenou tabulku | na.last = PRAVDA |
Protože order() vrací pozice, je to jediná z těchto tří funkcí, která může řídit podmnožinu hranatých závorek použitou na této stránce. Základní dokumentace R pro order() vypíše všechny argumenty, včetně argumentu metody, který vybírá algoritmus řazení.
Příklad 1: Seřazení datového rámce podle jednoho sloupce
Například můžeme vytvořit datový rámec tibble a seřadit jednu nebo více proměnných. Datový rámec tibble je moderní pojetí datový rámecVylepšuje syntaxi datového rámce a zabraňuje frustrujícímu formátování datových typů, zejména převodu znaků na faktory. Je to také pohodlný způsob, jak ručně vytvořit datový rámec, což je zde naším účelem. Chcete-li se dozvědět více o tibble, podívejte se na vinětu: https://tibble.tidyverse.org/articles/tibble.html
Následující kód vytvoří 50řádkový tibble s pěti náhodnými sloupci a poté seřadí každý řádek podle hodnot v c1. set.seed(1234) opraví náhodné losování, takže se na všech počítačích objeví stejná čísla.
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)
Výstup:
# 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
Čárka před uzavírací závorkou je důležitá: df[order(…), ] mění pořadí řádků, zatímco df[, order(…)] mění pořadí sloupců.
Příklad 2: Řazení podle více sloupců
Každý další argument předaný funkci order() slouží jako rozhodující faktor pro argument před ním. Zde je rámec seřazen podle c3 a řádky sdílející stejnou hodnotu c3 jsou poté seřazeny podle c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Výstup:
# 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
Příklad 3: Seřazení jednoho sloupce sestupně a druhého vzestupně
Každý sloupec může nést svůj vlastní směr. Pokud před číselný sloupec přidáte znaménko mínus, obrátí se pouze směr tohoto sloupce, takže níže uvedené řazení probíhá sestupně na sloupci c3 a vzestupně na sloupci c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Výstup:
# 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
Trik se znaménkem mínus funguje pouze u číselných sloupců. Pro sloupce typu znak nebo faktor použijte order(xtfrm(df$col), decreasing = TRUE) nebo přepněte na přístup dplyr, který je uveden dále.
Seřazení datového rámce pomocí dplyr arrange()
Idiom s hranatými závorkami se stává obtížně čitelným, pokud je zahrnuto několik sloupců a směrů, protože název rámce se opakuje v každém argumentu. dplyr Sloveso arrange() toto opakování odstraňuje: sloupce jsou pojmenovány jednou a desc() označuje ty, které běží pozpátku.
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
Za znát stojí tři praktické rozdíly:
- čitelnostarrange(desc(c3), c4) přímo uvádí záměr, zatímco order(-data_frame$c3, data_frame$c4) jej skryje za znaménko mínus.
- Typy sloupcůFunkce desc() funguje jak se sloupci se znaky a faktory, tak i s číselnými sloupci, takže není potřeba žádné alternativní řešení pomocí xtfrm().
- Chybějící hodnotyarrange() vždy umístí NA na poslední místo, bez ohledu na směr, zatímco order() umožňuje jejich přesun pomocí na.last.
Funkce arrange() vrací nový datový rámec a původní ponechává nedotčený, stejně jako verze s hranatými závorkami, takže výsledek musí být stále pojmenován, aby se zachoval. Seskupené rámce jsou seřazeny v rámci každé skupiny pouze tehdy, je-li zadáno .by_group = TRUE.
Řazení znaků, faktorů a chybějících hodnot v R
Číselné sloupce se řadí předvídatelně. Text, kategorie a mezery nikoli a každý z těchto tří vyžaduje jiné rozhodnutí.
Chybějící hodnoty. Metody sort() a order() se neshodují v tom, co dělat s NA, a proto může stejný sloupec vygenerovat dva různé počty řádků:
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
faktory. A faktor řadí podle úrovně, nikoli abecedně. To je přesně to, co chcete pro seřazené kategorie, jako je nízká, střední a vysoká, a přesně to nechcete, pokud byly úrovně vytvořeny v pořadí, v jakém se hodnoty objevily:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Sloupce znaků. Prostý text se řadí podle řazení podle lokality, takže velká písmena a diakritika mohou ovlivnit výsledek mezi počítači. Dva zvyky zabraňují překvapením: před řazením zkontrolujte třídu class(df$col) a pomocí funkce as.numeric() převeďte číslice uložené jako text tak, aby „10“ nedosáhlo před „2“.
