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

  • 🔢 Základy order(): order() vrací indexy řádků, které řadí sloupec ve vzestupném pořadí, nikoli samotné seřazené hodnoty.
  • 📌 Jeden sloupec: Funkce df[order(df$c1), ] přeskupí každý řádek rámce podle hodnot obsažených v c1.
  • 🧮 Více sloupců: Další argumenty fungují jako rozhodující faktory pro rozhodování o nerozhodném výsledku, takže order(df$c3, df$c4) seřadí podle c3 a poté podle c4.
  • 🔻 Sestupné pořadí: Přidejte před číselný sloupec znaménko mínus nebo předejte funkci sort() decreasing = TRUE.
  • 🧩 Trasa tidyverse: arrange() a desc() vyjadřují přesně stejné druhy jako čitelná slovesa typu dplyr.
  • ⚠️ Chybějící hodnoty: order() standardně umístí NA na poslední místo, zatímco sort() odstraní chybějící hodnoty, pokud není nastavena proměnná na.last.

R Seřadit datový rámec pomocí Order()

Ř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“.

Nejčastější dotazy

Použijte df[order(rownames(df)), ]. Názvy řádků jsou znakové, takže řazení následuje po řazení textu a „10“ se objeví před „2“. Pokud jsou číselné, zabalte je do as.numeric(). Tibbles zcela vynechávají názvy řádků, proto místo toho přidejte explicitní sloupec s id.

Předejte metodu = „radix“ metodě order(), což je nejrychlejší možnost pro celá čísla a krátké řetězce. Pro miliony řádků data.table::setorder() třídí na místě bez kopírování tabulky a sloveso dplyr arrange() již interně používá radixové řazení.

Index s obrácenou sekvencí: df[nrow(df):1, ]. Toto obrátí aktuální pořadí místo jeho seřazení, což je důležité, když byl snímek zamíchán nebo seskupen. Pokud popisky vypadají matoucí, resetujte je poté pomocí rownames(df) <- NULL.

Sloupec je uložen jako znak nebo faktor, takže R jej porovnává jako text a před „2“ vkládá „10“. Před seřazením zkontrolujte pomocí class(df$col) a poté převeďte pomocí as.numeric(as.character(df$col)).

Ne. order() vrací indexový vektor a df[order(…), ] vytvoří nový rámec, takže originál přežije nedotčený, dokud není výsledek přiřazen zpět. Názvy řádků si zachovávají své staré hodnoty, což je užitečná indicie, že rámec byl přeskupen.

Asistenti umělé inteligence dokáží rozpoznat sloupec uložený jako text, když číselné řazení vypadá špatně, převést základní volání order() v jazyce R do kanálu dplyr a navrhnout stabilní sloupec pro rozbití remízy. Před důvěryhodností výsledku vždy spusťte kód a zkontrolujte head().

Ano. GitHub Copilot Funguje v RStudio Desktop 2023.09.0 a novějších verzích a dokončuje volání order() a arrange() z prostého komentáře. Posit varuje, že návrhy nejsou deterministické, proto si před spuštěním každý řádek zkontrolujte.

Změňte pořadí indexu sloupce, nikoli indexu řádku. Funkce df[, order(names(df))] uspořádá sloupce abecedně a df[, c(“c3”, “c1”)] vybere explicitní pořadí. Uživatelé dplyr mohou volat funkci select(df, c3, c1), která v jednom kroku změní pořadí a podmnožiny.

Shrňte tento příspěvek takto: