R Sort Data Frame: order() Funktion med eksempel

โšก Smart opsummering

Sortering af en dataramme i R er afhรฆngig af funktionen order(), som returnerer rรฆkkepositioner i stedet for vรฆrdier. Ved at placere disse positioner i firkantede parenteser omarrangeres rรฆkkerne med รฉn kolonne, med flere kolonner eller i faldende rรฆkkefรธlge.

  • ๐Ÿ”ข order() Grundlรฆggende: order() returnerer rรฆkkeindekserne, der placerer en kolonne i stigende rรฆkkefรธlge, ikke selve de sorterede vรฆrdier.
  • ๐Ÿ“Œ Enkelt kolonne: df[order(df$c1),] omarrangerer hver rรฆkke i rammen efter de vรฆrdier, der er indeholdt i c1.
  • ๐Ÿงฎ Flere kolonner: Ekstra argumenter fungerer som tiebreakers, sรฅ order(df$c3, df$c4) sorterer efter c3 og derefter efter c4.
  • ๐Ÿ”ป Faldende rรฆkkefรธlge: Sรฆt et minustegn foran en numerisk kolonne, eller send decreasing = TRUE til sort().
  • ๐Ÿงฉ tidyverse-rute: arrange() og desc() udtrykker prรฆcis de samme sorteringer som lรฆsbare dplyr-verber.
  • โš ๏ธ Manglende vรฆrdier: order() placerer NA sidst som standard, mens sort() fjerner manglende vรฆrdier, medmindre na.last er indstillet.

R Sorter en dataramme ved hjรฆlp af Order()

Sortering af data i R

I dataanalyse kan du sort dine data i henhold til en bestemt variabel i datasรฆttet. I R kan vi bruge hjรฆlpen fra funktionen order(). I R kan vi nemt sortere en vektor af kontinuert variabel eller faktorvariabel. Ordning af data kan vรฆre af opstigende or aftagende rรฆkkefรธlge.

Syntaks:

sort(x, decreasing = FALSE, na.last = NA)

Argument:

  • xEn vektor, der indeholder en kontinuert variabel eller en faktorvariabel
  • faldendeStyrer sorteringsretningen. Som standard er faldende indstillet til FALSK, hvilket giver stigende rรฆkkefรธlge.
  • na.sidsteAngiver, om NA-vรฆrdier skal placeres sidst eller ej. sort() bruger NA som standard, hvilket fjerner manglende vรฆrdier; order() bruger TRUE, hvilket beholder dem og placerer dem sidst.

sort() vs. order() vs. rank() i R

Syntaksen ovenfor tilhรธrer sort(), men hvert eksempel pรฅ denne side kalder order(). De to funktioner besvarer forskellige spรธrgsmรฅl, og at blande dem sammen er den mest almindelige รฅrsag til, at en sortering tilsyneladende mislykkes. rank() fuldender trioen.

Funktion Returpolitik Brug det nรฅr Standard NA-hรฅndtering
sortere() Vรฆrdierne i sig selv, i rรฆkkefรธlge Du behรธver kun en sorteret vektor na.last = NA, sรฅ NA er droppet
bestille() De rรฆkkepositioner, der producerer den sorterede rรฆkkefรธlge Du skal omarrangere en hel dataramme na.last = TRUE, sรฅ NA kommer sidst
rang() Rangen af โ€‹โ€‹hvert element i dets oprindelige position Du har brug for en rangkolonne, ikke en omordnet tabel na.last = TRUE

Fordi order() returnerer positioner, er det den eneste af de tre, der kan styre den delmรฆngde af firkantede parenteser, der bruges pรฅ hele denne side. R-basisdokumentation for order() viser alle argumenter, inklusive metodeargumentet, der vรฆlger sorteringsalgoritmen.

Eksempel 1: Sortรฉr en dataramme efter รฉn kolonne

For eksempel kan vi oprette en tibble-dataramme og sortere en eller flere variabler. En tibble-dataramme er en moderne fortolkning af datarammeDet forbedrer datarammens syntaks og undgรฅr frustrerende formatering af datatyper, isรฆr konvertering fra tegn til faktor. Det er ogsรฅ en bekvem mรฅde at oprette en dataramme manuelt, hvilket er vores formรฅl her. For at lรฆre mere om tibble, se vignetten: https://tibble.tidyverse.org/articles/tibble.html

Koden nedenfor bygger en tibble med 50 rรฆkker bestรฅende af fem tilfรฆldige kolonner og sorterer derefter hver rรฆkke efter vรฆrdierne i c1. set.seed(1234) retter den tilfรฆldige trรฆkning, sรฅ de samme tal vises pรฅ enhver maskine.

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)

Output:

# 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

Kommaet fรธr den afsluttende parentes har betydning: df[order(โ€ฆ), ] omarrangerer rรฆkker, mens df[, order(โ€ฆ)] i stedet omarrangerer kolonner.

Eksempel 2: Sortรฉr efter flere kolonner

Hvert ekstra argument, der sendes til order(), fungerer som en tie-breaker for argumentet fรธr det. Her sorteres rammen efter c3, og rรฆkker, der deler den samme c3-vรฆrdi, sorteres derefter efter c4.

# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)

Output:

# 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

Eksempel 3: Sortรฉr รฉn kolonne faldende og en anden stigende

Hver kolonne kan have sin egen retning. Hvis der sรฆttes et minustegn foran en numerisk kolonne, vendes kun den pรฅgรฆldende kolonne om, sรฅ sorteringen nedenfor kรธrer faldende pรฅ c3 og stigende pรฅ c4.

# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)

Output:

# 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

Minustegn-tricket virker kun pรฅ numeriske kolonner. For tegn- eller faktorkolonner skal du bruge order(xtfrm(df$col), decreasing = TRUE), eller skifte til dplyr-tilgangen vist nedenfor.

Sortรฉr en dataramme med dplyr arrange()

Idiomet med firkantede parenteser bliver svรฆrt at lรฆse, nรฅr der er involveret flere kolonner og retninger, fordi rammenavnet gentages i hvert argument. dplyr Verbet arrange() fjerner den gentagelse: kolonner navngives รฉn gang, og desc() markerer dem, der kรธrer baglรฆns.

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

Tre praktiske forskelle er vรฆrd at kende:

  • Lรฆsbarhedarrange(desc(c3), c4) angiver intentionen direkte, mens order(-data_frame$c3, data_frame$c4) skjuler den bag et minustegn.
  • Kolonnetyperdesc() fungerer pรฅ tegn- og faktorkolonner sรฅvel som numeriske, sรฅ der er ikke behov for en lรธsning til xtfrm().
  • Manglende vรฆrdierarrange() placerer altid NA sidst, uanset retningen, hvorimod order() lader dig flytte dem med na.last.

arrange() returnerer en ny dataramme og lader originalen vรฆre uรฆndret, prรฆcis som versionen med firkantede parenteser, sรฅ resultatet skal stadig tildeles et navn for at blive beholdt. Grupperede rammer sorteres kun inden for hver gruppe, nรฅr .by_group = TRUE angives.

Sortering af tegn, faktorer og manglende vรฆrdier i R

Numeriske kolonner sorteres forudsigeligt. Tekst, kategorier og huller gรธr det ikke, og hver af de tre krรฆver en forskellig beslutning.

Manglende vรฆrdier. sort() og order() er uenige om, hvad de skal gรธre med NA, hvilket er grunden til, at den samme kolonne kan producere to forskellige rรฆkkeantal:

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

faktorer. A faktor sorterer efter niveauorden, ikke alfabetisk. Det er prรฆcis, hvad du รธnsker for ordnede kategorier som lav, mellem og hรธj, og prรฆcis, hvad du ikke รธnsker, hvis niveauerne blev oprettet i den rรฆkkefรธlge, vรฆrdierne tilfรฆldigvis optrรฅdte:

grades <- factor(c("low", "high", "medium"),
                 levels = c("low", "medium", "high"))
sort(grades)                # follows the level order
sort(as.character(grades))  # plain alphabetical order

Tegnkolonner. Almindelig tekst sorterer efter lokalitet, sรฅ brug af store bogstaver og accenter kan รฆndre resultatet mellem maskiner. Der er to vaner, der undgรฅr overraskelser: tjek class(df$col) fรธr sortering, og konverter cifre gemt som tekst med as.numeric(), sรฅ "10" ikke lander foran "2".

Ofte Stillede Spรธrgsmรฅl

Brug df[order(rownames(df)), ]. Rรฆkkenavne er tegn, sรฅ sorteringen fรธlger tekstsortering, og "10" kommer fรธr "2". Omslut dem i as.numeric(), nรฅr de er numeriske. Tibbles fjerner rรฆkkenavne helt, sรฅ tilfรธj i stedet en eksplicit id-kolonne.

Send metoden "radix" til order(), den hurtigste mulighed for heltal og korte strenge. For millioner af rรฆkker sorterer data.table::setorder() pรฅ plads uden at kopiere tabellen, og dplyr-verbet arrange() bruger allerede en radix-sortering internt.

Indeks med en omvendt sekvens: df[nrow(df):1, ]. Dette vender den aktuelle rรฆkkefรธlge i stedet for at sortere den, hvilket har betydning for, hvornรฅr rammen blev blandet eller grupperet. Nulstil etiketterne bagefter med rownames(df) <- NULL, hvis de ser forvirrende ud.

Kolonnen gemmes som tegn eller faktor, sรฅ R sammenligner den som tekst og sรฆtter "10" fรธr "2". Tjek med class(df$col), og konverter derefter ved hjรฆlp af as.numeric(as.character(df$col)) fรธr rรฆkkefรธlge.

Nr. order() returnerer en indeksvektor, og df[order(โ€ฆ), ] bygger en ny ramme, sรฅ originalen forbliver urรธrt, indtil resultatet tildeles tilbage. Rรฆkkenavne beholder deres gamle vรฆrdier, hvilket er et nyttigt fingerpeg om, at rammen blev omarrangeret.

AI-assistenter kan finde en kolonne gemt som tekst, nรฅr en numerisk sortering ser forkert ud, oversรฆtte et base R order()-kald til en dplyr-pipeline og foreslรฅ en stabil tie-breaker-kolonne. Kรธr altid koden, og inspicer head(), fรธr du stoler pรฅ resultatet.

Ja. GitHub Copilot fungerer i RStudio Desktop 2023.09.0 og nyere og fuldfรธrer order() og arrange() kald fra en almindelig kommentar. Posit advarer om, at forslag ikke er deterministiske, sรฅ gennemgรฅ hver linje, fรธr du kรธrer den.

Omarrangerer kolonneindekset i stedet for rรฆkkeindekset. df[, order(names(df))] arrangerer kolonner alfabetisk, og df[, c("c3", "c1")] vรฆlger en eksplicit rรฆkkefรธlge. dplyr-brugere kan kalde select(df, c3, c1), som omarrangerer og udmรฆngder i รฉt trin.

Opsummer dette indlรฆg med: