Menu
Coddy logo textTech

Ordenar por una clave

Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 38 de 64.

order(x) devuelve las posiciones que ordenarían x: primero la posición del valor más pequeño, después la siguiente, y así sucesivamente. Usa otro vector como índice con él para ordenar ese vector según x:

names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])

Salida:

[1] 3 2 1
[1] "bo"  "ada" "cy" 

Para el orden descendente, pasa decreasing = TRUE o coloca un signo menos delante de una clave numérica:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])

Salida:

[1] "ada" "cy"  "bo" 
[1] "ada" "cy"  "bo" 

Da a order() una segunda clave para desempatar. Aquí las puntuaciones se ordenan de mayor a menor y las puntuaciones iguales se ordenan por nombre:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])

Salida:

[1] "ada" "bo"  "cy" 

order() mantiene los valores empatados en su orden original cuando no se proporciona una segunda clave. Las mismas posiciones pueden reordenar varios vectores relacionados:

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])

Salida:

[1] "jam" "tea" "oil"
[1] 6 1 3
challenge icon

Desafío

Fácil

Completa ranking(names, scores). Devuelve una línea por jugador, 1. ada 95, desde la puntuación más alta hasta la más baja. Los jugadores con la misma puntuación aparecen en orden alfabético.

El código proporcionado lee los jugadores como pares name:score separados por comas e imprime cada línea devuelta.

Pruébalo tú mismo

ranking <- function(names, scores) {
  # Escribe tu código aquí
  character(0)
}

# Código de entrada/salida suministrado: déjalo 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")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de R online