R Academy · Lezione

order() per un ordinamento flessibile

Ottenga la permutazione degli indici per ordinare secondo uno o più criteri.

Lezione 2 di 413 passaggi

order() per un ordinamento flessibile è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Che cosa restituisce order()

order() non restituisce i valori ordinati, ma gli indici che consentirebbero di ordinare il vettore. Questa indirezione la rende molto più potente di sort(), perché può applicare quegli indici a qualsiasi struttura correlata.

x <- c(30, 10, 50, 20, 40)
indices <- order(x)
print(indices)
# Verify: x[indices] gives sorted x
print(x[indices])

order() in ordine decrescente

Come sort(), anche order() accetta decreasing = TRUE per restituire gli indici che producono una sequenza decrescente. È utile per ordinare dal valore più grande a quello più piccolo.

scores <- c(78, 92, 65, 88, 71)
desc_order <- order(scores, decreasing = TRUE)
cat('Rank order (index):', desc_order, '\n')
cat('Scores high to low:', scores[desc_order], '\n')

Ordinare un data frame in base a una colonna

L'uso più pratico di order() consiste nell'ordinare un data frame in base a una delle sue colonne. Passi la colonna a order(), quindi utilizzi gli indici restituiti per riordinare tutte le righe del data frame.

df <- data.frame(
  name = c('Charlie', 'Alice', 'Bob', 'Diana'),
  age  = c(35, 28, 42, 31)
)
sorted_df <- df[order(df$age), ]
print(sorted_df)

Ordinare un data frame in ordine decrescente

Per ordinare un data frame dal valore più grande a quello più piccolo in base a una colonna numerica, passi decreasing = TRUE a order(). I nomi delle righe (indici) nell'output riflettono le posizioni originali.

products <- data.frame(
  item  = c('Pen', 'Notebook', 'Stapler', 'Tape'),
  price = c(1.5, 4.99, 7.25, 2.10)
)
products[order(products$price, decreasing = TRUE), ]

Ordinamento su più colonne

Passi più vettori a order(), separandoli con virgole. R ordina in base al primo argomento, poi risolve le parità usando il secondo, il terzo e così via. Questo comportamento corrisponde alla clausola ORDER BY di SQL.

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# Sort by dept first, then by salary within dept
df[order(df$dept, df$salary), ]

Ordinamento multiplo misto crescente/decrescente

Per ordinare una colonna in modo crescente e un'altra in modo decrescente, neghi la colonna numerica decrescente con -. Per le colonne character, utilizzi xtfrm() per ottenere una rappresentazione integer ordinabile e poi la neghi.

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# dept ascending, salary descending
df[order(df$dept, -df$salary), ]

Gestire gli NA in order()

order() dispone anch'essa dell'argomento na.last, proprio come sort(). Per impostazione predefinita, na.last = NA colloca gli NA alla fine. Imposti na.last = TRUE o na.last = FALSE per controllarne esplicitamente la posizione.

vals <- c(5, NA, 2, NA, 8, 1)
# Default: NAs sorted last
order(vals)
# NAs first
order(vals, na.last = FALSE)

Preservare i nomi delle righe dopo l'ordinamento

Quando seleziona un sottoinsieme di un data frame usando gli indici delle righe, R conserva i nomi originali delle righe. Utilizzi row.names(df) <- NULL oppure approcci con reset= per reimpostarli su 1, 2, 3, ... dopo l'ordinamento.

df <- data.frame(
  city = c('Paris', 'Tokyo', 'NYC'),
  pop  = c(2.1, 13.9, 8.3)
)
sorted <- df[order(df$pop), ]
print(sorted)
# Reset row names
row.names(sorted) <- NULL
print(sorted)

order() e sort() a confronto

La differenza principale è questa: sort(x) restituisce i valori ordinati, mentre order(x) restituisce le posizioni ordinate. Usi sort() quando le servono solo i valori; usi order() quando deve riordinare insieme strutture di dati correlate.

x <- c(50, 20, 80, 10, 60)
cat('sort(x)  :', sort(x), '\n')
cat('order(x) :', order(x), '\n')
cat('x[order(x)]:', x[order(x)], '\n')

Ordinare un data frame in base a una colonna stringa

Può ordinare anche in base a colonne character. order(df$name) restituisce gli indici delle righe in ordine alfabetico rispetto alla colonna name, che può poi utilizzare per riordinare il data frame.

employees <- data.frame(
  name   = c('Zara', 'Ahmed', 'Maria', 'Bruno'),
  tenure = c(3, 7, 2, 5)
)
employees[order(employees$name), ]

Combinare order() per ordinamenti complessi

Un ordinamento su tre livelli è semplice: passi tre vettori a order(). Ogni argomento aggiuntivo viene usato come criterio di spareggio per i valori uguali negli argomenti precedenti.

df <- data.frame(
  region = c('West', 'East', 'West', 'East', 'West'),
  dept   = c('HR', 'IT', 'HR', 'IT', 'IT'),
  score  = c(85, 90, 78, 88, 92)
)
df[order(df$region, df$dept, df$score), ]

Verifica rapida

Che cosa restituisce order(x) quando viene applicata a un vettore x?

Concetti chiave di order()

Concetti chiave di order():

  • order(x) restituisce indici, non valori: usi x[order(x)] per ottenere i valori ordinati
  • Ordini i data frame con df[order(df$col), ]
  • Ordinamento su più colonne: order(df$a, df$b): le parità in a vengono risolte usando b
  • Neghi le colonne numeriche con - per ottenere un ordinamento decrescente negli ordinamenti multipli
  • Controlli la posizione degli NA con na.last = TRUE/FALSE/NA
  • A differenza di sort(), order() consente di ordinare insieme strutture parallele
df <- data.frame(
  name  = c('Eve', 'Bob', 'Alice', 'Charlie'),
  score = c(88, 92, 88, 75)
)
# Sort by score descending, then name ascending for ties
df[order(-df$score, df$name), ]
Gratis per iniziare

Impara R con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
43
Lezioni
159

Domande Frequenti

La lezione «order() per un ordinamento flessibile» è gratuita?

Sì — il testo completo di «order() per un ordinamento flessibile» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «order() per un ordinamento flessibile»?

Ottenga la permutazione degli indici per ordinare secondo uno o più criteri. Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «order() per un ordinamento flessibile»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione R Academy?

Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ordinamento dei vettori con sort()
  2. order() per un ordinamento flessibile
  3. Classificazione dei valori con rank()
  4. Ordinamento dei data frame per colonna
← Torna a R Academy