Menu
Coddy logo textTech

Сортировка по ключу

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 38 из 64.

order(x) возвращает позиции, которые отсортировали бы x: сначала позицию наименьшего значения, затем следующего и так далее. Используйте его для индексации другого вектора, чтобы отсортировать этот вектор по x:

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

Вывод:

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

Для убывающего порядка передайте decreasing = TRUE или поставьте знак минус перед числовым ключом:

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

Результат:

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

Передайте order() второй ключ, чтобы разрешить неоднозначности. Здесь оценки сортируются от высокой к низкой, а одинаковые оценки — по имени:

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

Результат:

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

order() сохраняет исходный порядок связанных значений, если второй ключ не задан. Одни и те же позиции могут переупорядочить несколько связанных между собой векторов:

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

Результат:

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

Задание

Легко

Дополните ranking(names, scores). Верните по одной строке для каждого игрока, например 1. ada 95, от наибольшего результата к наименьшему. Игроки с одинаковым результатом перечисляются в алфавитном порядке.

Предоставленный код считывает игроков как пары name:score, разделённые запятыми, и выводит каждую возвращённую строку.

Попробуйте сами

ranking <- function(names, scores) {
  # Напишите ваш код здесь
  character(0)
}

# Предоставленный код ввода/вывода: оставьте его как есть
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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R