Сортировка по ключу
Часть раздела Логика и потоки выполнения путешествия по 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Задание
ЛегкоДополните 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")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок8Сортировка и группировка
Сортировка векторовСортировка по ключуГруппировка с помощью split()Итоги по группамПовторение — таблица лидеров3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R