0Pricing
R Academy · Урок

Ранжирование значений с помощью rank()

Назначайте ранги с методами разрешения одинаковых значений: average, first, min, max, random.

«Ранжирование значений с помощью rank()» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Что возвращает rank()

rank(x) возвращает выборочные ранги значений вектора. Наименьшее значение получает ранг 1, второе по величине — ранг 2 и так далее. В отличие от order(), результат имеет ту же длину, что и входной вектор, а каждая позиция содержит свой ранг.

scores <- c(78, 92, 65, 88, 71)
ranks <- rank(scores)
print(scores)
print(ranks)

Одинаковые значения: метод среднего ранга

Когда значения равны, rank() использует аргумент ties.method, чтобы определить способ присвоения рангов. По умолчанию используется 'average': совпадающие элементы получают среднее арифметическое рангов, которые они заняли бы.

x <- c(10, 20, 20, 30)
# Default: average of positions 2 and 3 = 2.5
rank(x)
rank(x, ties.method = 'average')

Метод ties: first и last

ties.method = 'first' присваивает меньший ранг тому из совпадающих элементов, который встречается в векторе первым. 'last' работает наоборот: более ранний элемент получает больший ранг.

x <- c(10, 20, 20, 30)
cat('first:', rank(x, ties.method = 'first'), '\n')
cat('last: ', rank(x, ties.method = 'last'),  '\n')

Метод ties: min и max

'min' присваивает всем совпадающим элементам минимальный возможный ранг (так используется в спорте: два игрока, занявшие 3-е место, оба получают ранг 3, и никто не получает ранг 4). 'max' присваивает всем совпадающим элементам максимальный ранг.

x <- c(10, 20, 20, 30)
cat('min:', rank(x, ties.method = 'min'), '\n')
cat('max:', rank(x, ties.method = 'max'), '\n')

Метод ties: random

ties.method = 'random' разрешает совпадения, случайным образом присваивая совпадающим элементам различные ранги. Результат каждого вызова может отличаться. Это полезно, когда нужны уникальные integer-ранги, но порядок разрешения совпадений не важен.

x <- c(10, 20, 20, 20, 30)
set.seed(42)
cat('random run 1:', rank(x, ties.method = 'random'), '\n')
set.seed(99)
cat('random run 2:', rank(x, ties.method = 'random'), '\n')

Плотное и стандартное ранжирование

rank() в R создаёт стандартное соревновательное ранжирование (1, 2, 2, 4). Для плотного ранжирования (1, 2, 2, 3 — без пропусков) примените rank(x, ties.method = 'min') к уникальным значениям или используйте пакеты data.table либо dplyr. Вот решение на базовых средствах R:

x <- c(10, 20, 20, 30)
# Standard ranking (gaps after ties)
cat('Standard:', rank(x, ties.method = 'min'), '\n')
# Dense ranking: rank of sorted unique values
dense <- match(x, sort(unique(x)))
cat('Dense:   ', dense, '\n')

rank() и order() и sort()

Эти три функции связаны между собой, но возвращают разные результаты: sort(x) возвращает отсортированные значения, order(x) — позиции, в порядке которых вектор будет отсортирован, а rank(x) — ранг каждой позиции. Ниже приведено наглядное сравнение.

x <- c(30, 10, 50, 20, 40)
cat('x       :', x,        '\n')
cat('sort(x) :', sort(x),  '\n')
cat('order(x):', order(x), '\n')
cat('rank(x) :', rank(x),  '\n')

Ранжирование в порядке убывания

Чтобы ранжировать значения от наибольшего к наименьшему (ранг 1 = наибольшее значение), передайте в rank() вектор, предварительно изменив знак его элементов. Это стандартный приём для таблиц лидеров, где ранг 1 означает лучший результат.

scores <- c(78, 92, 65, 88, 71)
desc_ranks <- rank(-scores)
cat('Scores:      ', scores,     '\n')
cat('Rank (best=1):', desc_ranks, '\n')

Добавление рангов в таблицу данных

Часто требуется добавить в таблицу данных столбец с рангами. Используйте rank() с параметром ties.method = 'min' и измените знак значений для ранжирования по убыванию, чтобы построить корректную таблицу лидеров.

df <- data.frame(
  player = c('Alice', 'Bob', 'Carol', 'Dave'),
  score  = c(250, 400, 250, 375)
)
df$rank <- rank(-df$score, ties.method = 'min')
df[order(df$rank), ]

rank() и значения NA

У функции rank() есть аргумент na.last, как у sort() и order(). По умолчанию используется 'keep': значениям NA присваивается ранг NA, а элементы, отличные от NA, ранжируются между собой.

x <- c(5, NA, 2, NA, 8, 1)
cat('na.last=keep:  ', rank(x, na.last = 'keep'), '\n')
cat('na.last=TRUE:  ', rank(x, na.last = TRUE),   '\n')
cat('na.last=FALSE: ', rank(x, na.last = FALSE),  '\n')

Процентильные ранги

Преобразуйте ранги в процентили, разделив их на общее количество элементов. Процентильный ранг показывает, какая доля значений меньше либо равна данному элементу. Это полезно в статистике и при оценивании знаний.

scores <- c(60, 75, 82, 91, 68, 77, 85, 95)
n <- length(scores)
pct_rank <- rank(scores) / n * 100
result <- data.frame(score = scores, percentile = round(pct_rank, 1))
result[order(result$score), ]

Быстрая проверка

Какой вариант ties.method присваивает всем элементам с одинаковыми значениями один и тот же наименьший возможный ранг (как в спорте, когда два игрока занимают 3-е место и никто не получает 4-е)?

Основные выводы о rank()

Основные выводы о rank():

  • rank(x) возвращает ранг каждого элемента (длина результата совпадает с длиной входных данных)
  • По умолчанию ties.method = 'average': элементы с одинаковыми значениями получают среднее своих рангов
  • 'min' = спортивный вариант (общий наименьший ранг), 'max' = общий наибольший ранг
  • 'first' и 'last' разрешают одинаковые ранги по порядку появления элементов
  • Используйте rank(-x) для ранжирования по убыванию (ранг 1 = наибольшее значение)
  • Добавляйте столбцы с рангами в таблицы данных с помощью df$rank <- rank(-df$score, ties.method='min')
x <- c(10, 30, 20, 30, 10)
cat('average:', rank(x, ties.method = 'average'), '\n')
cat('min:    ', rank(x, ties.method = 'min'),     '\n')
cat('max:    ', rank(x, ties.method = 'max'),     '\n')
cat('first:  ', rank(x, ties.method = 'first'),   '\n')

Часто задаваемые вопросы

Урок «Ранжирование значений с помощью rank()» бесплатный?

Да — полный текст урока «Ранжирование значений с помощью rank()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ранжирование значений с помощью rank()»?

Назначайте ранги с методами разрешения одинаковых значений: average, first, min, max, random. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Ранжирование значений с помощью rank()»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сортировка векторов с помощью sort()
  2. order() для гибкой сортировки
  3. Ранжирование значений с помощью rank()
  4. Сортировка таблиц данных по столбцу
← Назад к R Academy