Ordinare in base a una chiave
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 38 di 64.
order(x) restituisce le posizioni che ordinerebbero x: prima la posizione del valore più piccolo, poi quella del successivo e così via. Usalo per indicizzare un altro vettore e ordinarlo in base a x:
names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])Output:
[1] 3 2 1
[1] "bo" "ada" "cy" Per l'ordine decrescente, passa decreasing = TRUE oppure metti un segno meno davanti a una chiave numerica:
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])Output:
[1] "ada" "cy" "bo"
[1] "ada" "cy" "bo" Assegna a order() una seconda chiave per risolvere le parità. Qui i punteggi sono ordinati dal più alto al più basso e, a parità di punteggio, i nomi sono ordinati alfabeticamente:
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])Output:
[1] "ada" "bo" "cy" order() mantiene i valori a pari merito nel loro ordine originale quando non viene fornita una seconda chiave. Le stesse posizioni possono riordinare diversi vettori correlati:
items <- c("tea", "jam", "oil")
price <- c(4, 2.5, 4)
qty <- c(1, 6, 3)
idx <- order(price)
print(items[idx])
print(qty[idx])Output:
[1] "jam" "tea" "oil"
[1] 6 1 3Sfida
FacileCompleta ranking(names, scores). Restituisci una riga per ogni giocatore, 1. ada 95, dal punteggio più alto a quello più basso. I giocatori con lo stesso punteggio sono elencati in ordine alfabetico.
Il codice fornito legge i giocatori come coppie name:score separate da virgole e stampa ogni riga restituita.
Provalo tu
ranking <- function(names, scores) {
# Escribe tu código aquí
character(0)
}
# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
pairs <- strsplit(strsplit(input[1], ",")[[1]], ":")
names <- sapply(pairs, function(p) p[1])
values <- as.numeric(sapply(pairs, function(p) p[2]))
cat(ranking(names, values), sep = "\n")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online