Ordinamento di un DataFrame in R: funzione order() con esempio
โก Riepilogo intelligente
L'ordinamento di un data frame in R si basa sulla funzione order(), che restituisce le posizioni delle righe anzichรฉ i valori. Passando queste posizioni tra parentesi quadre, le righe vengono riordinate in base a una colonna, a piรน colonne o in ordine decrescente.

Ordinamento dei dati in R
Nell'analisi dei dati puoi sorta i tuoi dati in base a una determinata variabile nel set di dati. In R possiamo utilizzare l'aiuto della funzione order(). In R, possiamo facilmente ordinare un vettore di variabile continua o variabile fattore. L'organizzazione dei dati puรฒ essere di ascendente or discendente ordine.
Sintassi:
sort(x, decreasing = FALSE, na.last = NA)
Discussione:
- x: Un vettore contenente una variabile continua o fattoriale
- decrescente: Controlla la direzione dell'ordinamento. Per impostazione predefinita, l'ordinamento decrescente รจ impostato su FALSE, il che produce un ordinamento crescente.
- na.last: Indica se i valori NA devono essere posizionati per ultimi o meno. sort() utilizza NA per impostazione predefinita, eliminando i valori mancanti; order() utilizza TRUE, mantenendoli e posizionandoli per ultimi.
sort() vs order() vs rank() in R
La sintassi sopra riportata appartiene alla funzione sort(), eppure ogni esempio in questa pagina utilizza la funzione order(). Le due funzioni rispondono a domande diverse e confonderle รจ la causa piรน comune di un errore di ordinamento. La funzione rank() completa il trio.
| Funzione | Resi | Usalo quando | Gestione predefinita NA |
|---|---|---|---|
| ordinare() | I valori stessi, in ordine | ร sufficiente un vettore ordinato | na.last = NA, quindi NA viene eliminato |
| ordine() | Le posizioni delle righe che producono l'ordine ordinato | ร necessario riordinare un intero data frame | na.last = TRUE, quindi NA va per ultimo |
| rango() | La posizione di ciascun elemento nella sua posizione originale | Ti serve una colonna di classificazione, non una tabella riordinata. | na.last = TRUE |
Poichรฉ order() restituisce posizioni, รจ l'unica delle tre in grado di gestire il sottoinsieme tra parentesi quadre utilizzato in tutta questa pagina. Documentazione di base R per order() Elenca tutti gli argomenti, incluso l'argomento del metodo che seleziona l'algoritmo di ordinamento.
Esempio 1: Ordinare un Data Frame in base a una colonna
Ad esempio, possiamo creare un data frame tibble e ordinare una o piรน variabili. Un data frame tibble รจ una versione moderna del Frame datiMigliora la sintassi del data frame ed evita frustranti problemi di formattazione dei tipi di dati, in particolare la conversione da carattere a fattore. ร anche un modo pratico per creare un data frame manualmente, che รจ il nostro scopo in questo caso. Per saperne di piรน su tibble, consultare la documentazione. https://tibble.tidyverse.org/articles/tibble.html
Il codice seguente crea una tibble di 50 righe con cinque colonne casuali e poi ordina ogni riga in base ai valori in c1. set.seed(1234) corregge l'estrazione casuale, in modo che gli stessi numeri appaiano su qualsiasi macchina.
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)
Produzione:
# 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
La virgola prima della parentesi chiusa รจ importante: df[order(โฆ), ] riordina le righe, mentre df[, order(โฆ)] riordina le colonne.
Esempio 2: Ordinamento per piรน colonne
Ogni argomento aggiuntivo passato a order() funge da criterio di spareggio per l'argomento precedente. In questo caso, il frame viene ordinato in base a c3 e le righe che condividono lo stesso valore di c3 vengono quindi ordinate in base a c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Produzione:
# 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
Esempio 3: Ordinare una colonna in ordine decrescente e un'altra in ordine crescente
Ogni colonna puรฒ avere una direzione diversa. Anteponendo un segno meno a una colonna numerica, si inverte solo quella colonna; pertanto, l'ordinamento seguente procede in ordine decrescente in c3 e in ordine crescente in c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Produzione:
# 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
Il trucco del segno meno funziona solo con le colonne numeriche. Per le colonne di tipo carattere o fattore, utilizzare order(xtfrm(df$col), decreasing = TRUE) oppure passare all'approccio dplyr mostrato di seguito.
Ordina un Data Frame con dplyr arrange()
La sintassi tra parentesi quadre diventa difficile da leggere quando sono coinvolte diverse colonne e direzioni, perchรฉ il nome del frame viene ripetuto all'interno di ogni argomento. dplyr Il verbo arrange() elimina tale ripetizione: le colonne vengono nominate una sola volta e desc() contrassegna quelle che procedono a ritroso.
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
ร opportuno conoscere tre differenze pratiche:
- leggibilitร : arrange(desc(c3), c4) dichiara direttamente l'intento, mentre order(-data_frame$c3, data_frame$c4) lo nasconde dietro un segno meno.
- Tipi di colonneLa funzione desc() funziona sia con colonne di tipo carattere che con colonne di tipo fattore, quindi non รจ necessario ricorrere alla soluzione alternativa xtfrm().
- Valori mancantiLa funzione arrange() posiziona sempre NA per ultimo, indipendentemente dalla direzione, mentre order() permette di spostarli con na.last.
La funzione arrange() restituisce un nuovo data frame e lascia inalterato l'originale, esattamente come nella versione con parentesi quadre, quindi il risultato deve comunque essere assegnato a un nome per essere conservato. I frame raggruppati vengono ordinati all'interno di ciascun gruppo solo quando viene specificato .by_group = TRUE.
Ordinamento di caratteri, fattori e valori mancanti in R
Le colonne numeriche si ordinano in modo prevedibile. Testo, categorie e spazi vuoti non lo fanno, e ognuno di questi elementi richiede una decisione diversa.
Valori mancanti. Le funzioni sort() e order() non concordano su come gestire i valori NA, motivo per cui la stessa colonna puรฒ produrre due conteggi di righe diversi:
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
Fattori. A fattore Ordina in base al livello, non in ordine alfabetico. Questo รจ esattamente ciรฒ che si desidera per categorie ordinate come basso, medio e alto, ed รจ esattamente ciรฒ che non si desidera se i livelli sono stati creati nell'ordine in cui i valori si sono presentati:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Colonne dei caratteri. L'ordinamento del testo semplice si basa sulle impostazioni locali, quindi la distinzione tra maiuscole e minuscole e gli accenti possono variare a seconda del computer. Due accorgimenti evitano sorprese: controllare la classe (df$col) prima dell'ordinamento e convertire le cifre memorizzate come testo con as.numeric() in modo che "10" non venga visualizzato prima di "2".
