R offre diversi modi per ordinare i dati in ordine crescente o decrescente; data analyst e data scientist usano order(), sort() e pacchetti come dplyr per ordinare i dati a seconda della loro struttura.
TL;DR
- Usa
sort()per ordinare direttamente un vettore e ottenere i valori ordinati - Usa
order()per ottenere gli indici che ordinerebbero un vettore — ideale per ordinare i data frame - Usa
dplyr::arrange()per un approccio moderno e leggibile all'ordinamento dei data frame - Gestisci i valori NA con il parametro
na.last(TRUE mette gli NA in fondo, FALSE all'inizio) - Ordina in ordine decrescente con
decreasing = TRUEo usando il segno meno
order() può ordinare vettori, matrici e anche un data frame in ordine crescente e decrescente, come mostrato nella sezione finale di questo tutorial.
Sintassi di order()
La funzione sort()
Prima di entrare in order(), vediamo la più semplice funzione sort(). Mentre order() restituisce indici, sort() restituisce direttamente i valori ordinati:
# Create a vector
values <- c(4, 12, 6, 7, 2, 9, 5)
# sort() returns the sorted values directly
sort(values)
[1] 2 4 5 6 7 9 12
La differenza chiave è che sort() ti dà i valori effettivamente ordinati, mentre order() ti dà le posizioni. Questo rende order() più utile per ordinare i data frame, come vedremo più avanti.
Sintassi di order()
La sintassi di order() è mostrata qui sotto:
order(x, decreasing = TRUE or FALSE, na.last = TRUE or FALSE, method = c("auto", "shell", "quick", "radix"))
Gli argomenti di order() indicano che:
- x: data frame, matrici o vettori
- decreasing: valore booleano; TRUE ordina in ordine decrescente, FALSE ordina in ordine crescente.
- na.last: valore booleano; TRUE mette gli indici NA alla fine, FALSE li mette all'inizio.
- method: metodo di ordinamento da utilizzare.
order() in R
Vediamo un esempio di order() in azione.
Il codice seguente crea un vettore y che contiene una lista di numeri. Userò order(y) per ottenere gli indici che ordinerebbero questi numeri.
y <- c(4, 12, 6, 7, 2, 9, 5)
order(y)
Il codice sopra produce il seguente output:
5 1 7 3 4 6 2
Qui order() ordina i numeri dati in base ai loro indici in ordine crescente. Poiché il numero 2 è il più piccolo, ha indice cinque, e il numero 4 ha indice 1; allo stesso modo, il processo prosegue con lo stesso schema.
y <- c(4, 12, 6, 7, 2, 9, 5)
y[order(y)]
Il codice sopra produce il seguente output:
2 4 5 6 7 9 12
Qui viene applicato l'indicizzamento restituito da order() e vengono stampati i valori effettivi in ordine crescente. I valori sono ordinati secondo l'indice usando order() e poi ogni valore è accessibile usando y[valore].
Ordinare un vettore usando diversi parametri in order()
Vediamo un esempio in cui il dataset contiene il valore come simbolo NA (Not available).
order(x,na.last=TRUE)
x <- c(8, 2, 4, 1, -4, NA, 46, 8, 9, 5, 3)
order(x, na.last = TRUE)
Il codice sopra produce il seguente output:
5 4 2 11 3 10 1 8 9 7 6
Qui order() ordina anche la lista di numeri data in base agli indici in ordine crescente. Poiché è presente NA, il suo indice verrà messo in fondo: l'indice 6 sarà in ultima posizione a causa di na.last=TRUE.
order(x,na.last=FALSE)
order(x, na.last = FALSE)
Il codice sopra produce il seguente output:
6 5 4 2 11 3 10 1 8 9 7
Qui order() ordina anche la lista di numeri data in base agli indici in ordine crescente. Poiché è presente NA, il suo indice, che è 6, verrà messo all'inizio a causa di na.last=FALSE.
order(x,decreasing=TRUE,na.last=TRUE)
order(x, decreasing = TRUE, na.last = TRUE)
Il codice sopra produce il seguente output:
7 9 1 8 10 3 11 2 4 5 6
Qui order() ordina la lista di numeri data in base agli indici in ordine decrescente grazie a decreasing=TRUE: 46, il più grande, è in posizione con indice 7, e gli altri valori sono disposti in modo decrescente. Poiché è presente NA, l'indice 6 sarà messo in fondo a causa di na.last=TRUE.
order(x,decreasing=FALSE,na.last=FALSE)
order(x, decreasing = FALSE, na.last = FALSE)
Il codice sopra produce il seguente output:
6 5 4 2 11 3 10 1 8 9 7
Qui è presente NA il cui indice è 6, e verrà messo all'inizio a causa di na.last=FALSE. order() ordina la lista di numeri data in base agli indici in ordine crescente poiché decreasing=FALSE: -4, il più piccolo, è in posizione con indice 5 e gli altri valori sono disposti in modo crescente.
Inizia a imparare R gratis
R intermedio
Ordinare un data frame usando order()
Creiamo un data frame con valore di popolazione pari a 10. La variabile gender è composta dai valori del vettore 'male' e 'female' da cui si possono ottenere 10 valori di esempio con sample(), mentre replace = TRUE genererà solo valori univoci. Allo stesso modo, age contiene valori da 25 a 75, insieme a degree con possibili valori c("MA," "ME," "BE," "BSCS"), che di nuovo genererà valori univoci.
Obiettivo: ordinare i dati in ordine crescente in base all'età della popolazione data.
Nota: i dati di esempio mostrati possono differire quando proverai a usarli in locale, perché ogni esecuzione del codice crea un data frame univoco.
population <- 10
gender <- sample(c("male", "female"), population, replace = TRUE)
age <- sample(25:75, population, replace = TRUE)
degree <- sample(c("MA", "ME", "BE", "BSCS"), population, replace = TRUE)
final_data <- data.frame(gender = gender, age = age, degree = degree)
final_data
| gender | age | degree |
|---|---|---|
| male | 40 | MA |
| female | 57 | BSCS |
| male | 66 | BE |
| female | 61 | BSCS |
| female | 48 | MA |
| male | 25 | MA |
| female | 49 | BE |
| male | 52 | ME |
| female | 57 | MA |
| female | 35 | MA |
Il codice sopra produce il seguente output, che mostra un data frame appena creato.
gender age degree
male 40 MA
female 57 BSCS
male 66 BE
female 61 BSCS
female 48 MA
male 25 MA
female 49 BE
male 52 ME
female 57 MA
female 35 MA
Ordiniamo il data frame in ordine crescente usando order() in base alla variabile age.
order(final_data$age)
Il codice sopra produce il seguente output:
6 10 3 9 5 8 4 2 7 1
Poiché l'età 25 è all'indice 6 seguita da 35 all'indice 10, e così via, tutti i valori di età sono disposti in ordine crescente.
Il codice seguente utilizza l'ordinamento con [] sulla variabile age per disporre in ordine crescente, stampando anche le informazioni su gender e degree.
final.data[order(final.data$age),]
| gender | age | degree | |
|---|---|---|---|
| 6 | male | 25 | MA |
| 10 | female | 35 | MA |
| 1 | male | 40 | MA |
| 5 | female | 48 | MA |
| 7 | female | 49 | BE |
| 8 | male | 52 | ME |
| 2 | female | 57 | BSCS |
| 9 | female | 57 | MA |
| 4 | female | 61 | BSCS |
| 3 | male | 66 | BE |
Il codice sopra produce il seguente output:
gender age degree
6 male 25 MA
10 female 35 MA
1 male 40 MA
5 female 48 MA
7 female 49 BE
8 male 52 ME
2 female 57 BSCS
9 female 57 MA
4 female 61 BSCS
3 male 66 BE
L'output sopra mostra che l'età è disposta in ordine crescente insieme alle corrispondenti informazioni su gender e degree.
Ordinamento con arrange() di dplyr
Per un approccio più leggibile e moderno, puoi usare la funzione arrange() del pacchetto dplyr. È particolarmente utile quando lavori nell'ecosistema tidyverse:
# Install dplyr if needed: install.packages("dplyr")
library(dplyr)
# Sort by age in ascending order
final_data %>% arrange(age)
# Sort by age in descending order
final_data %>% arrange(desc(age))
# Sort by multiple columns
final_data %>% arrange(gender, desc(age))
La funzione arrange() è spesso preferita nei flussi di lavoro di analisi dei dati perché si integra senza problemi con altre funzioni di dplyr come filter(), select() e mutate() usando il pipe operator.
Confronto dei metodi di ordinamento
| Funzione | Restituisce | Ideale per | Pacchetto |
|---|---|---|---|
sort() |
Valori ordinati | Vettori | Base R |
order() |
Indici | Data frame, ordinamenti complessi | Base R |
arrange() |
Data frame ordinato | Workflow Tidyverse | dplyr |
setorder() |
Modifica in place | Dataset di grandi dimensioni (efficiente in memoria) | data.table |
Conclusione
In questo tutorial ho coperto i metodi essenziali per ordinare i dati in R:
sort()per ordinare direttamente i vettoriorder()per ottenere gli indici con cui ordinare vettori e data frame- Gestione dei valori NA con il parametro
na.last dplyr::arrange()per un ordinamento dei data frame moderno e leggibile- Ordinamento su più colonne per esigenze di ordinamento complesse
Per maggiori informazioni, consulta la documentazione ufficiale di R per order().
Se vuoi saperne di più su R, segui il corso Introduction to R di DataCamp. Puoi anche esplorare il nostro tutorial su data.table per una manipolazione dei dati ad alte prestazioni o consultare la nostra guida sulle pipe in R per un codice più pulito.

