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.

  • ๐Ÿ”ข Nozioni di base sull'ordine(): La funzione order() restituisce gli indici di riga che ordinano una colonna in ordine crescente, non i valori ordinati stessi.
  • ???? Colonna singola: df[order(df$c1), ] riordina ogni riga del frame in base ai valori contenuti in c1.
  • ๐Ÿงฎ Colonne multiple: Gli argomenti aggiuntivi fungono da criteri di spareggio, quindi order(df$c3, df$c4) ordina prima in base a c3 e poi in base a c4.
  • ???? Ordine decrescente: Anteponi un segno meno a una colonna numerica oppure passa decreasing = TRUE alla funzione sort().
  • ๐Ÿงฉ Percorso tidyverse: Le funzioni arrange() e desc() esprimono esattamente gli stessi tipi di dati dei verbi dplyr leggibili.
  • โš ๏ธ Valori mancanti: La funzione order() posiziona i valori NA per ultimi per impostazione predefinita, mentre la funzione sort() rimuove i valori mancanti a meno che non sia impostato na.last.

R Ordina un frame di dati utilizzando Order()

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

DOMANDE FREQUENTI

Utilizza df[order(rownames(df)), ]. I nomi delle righe sono di tipo carattere, quindi l'ordinamento segue la collazione del testo e "10" viene visualizzato prima di "2". Inseriscili in as.numeric() quando sono numerici. I tibble eliminano completamente i nomi delle righe, quindi aggiungi invece una colonna ID esplicita.

Passa il metodo = โ€œradixโ€ a order(), l'opzione piรน veloce per numeri interi e stringhe brevi. Per milioni di righe, data.table::setorder() ordina sul posto senza copiare la tabella e il verbo dplyr arrange() utilizza giร  internamente un ordinamento radix.

Indice con sequenza invertita: df[nrow(df):1, ]. Questo inverte l'ordine corrente invece di ordinarlo, il che รจ importante quando il frame รจ stato mescolato o raggruppato. Reimposta le etichette in seguito con rownames(df) <- NULL se risultano confuse.

La colonna รจ memorizzata come carattere o fattore, quindi R la confronta come testo e mette "10" prima di "2". Controlla con class(df$col), quindi converti usando as.numeric(as.character(df$col)) prima di ordinare.

No. order() restituisce un vettore di indici e df[order(โ€ฆ), ] costruisce un nuovo frame, quindi l'originale sopravvive inalterato finchรฉ il risultato non viene riassegnato. I nomi delle righe mantengono i loro vecchi valori, il che รจ un utile indizio del fatto che il frame รจ stato riordinato.

Gli assistenti basati sull'IA possono individuare una colonna memorizzata come testo quando un ordinamento numerico sembra errato, tradurre una chiamata `order()` di base di R in una pipeline dplyr e suggerire una colonna stabile per la risoluzione dei casi di paritร . Eseguire sempre il codice e controllare `head()` prima di fidarsi del risultato.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub Funziona in RStudio Desktop 2023.09.0 e versioni successive e completa le chiamate order() e arrange() da un semplice commento. Posit avverte che i suggerimenti non sono deterministici, quindi rivedi ogni riga prima di eseguirla.

Riordina in base all'indice di colonna anzichรฉ all'indice di riga. df[, order(names(df))] ordina le colonne alfabeticamente, mentre df[, c(โ€œc3โ€, โ€œc1โ€)] seleziona un ordine esplicito. Gli utenti di dplyr possono chiamare select(df, c3, c1), che riordina e seleziona i sottoinsiemi in un unico passaggio.

Riassumi questo post con: