Ранжирование значений с помощью 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 — локальная установка не требуется.
Все уроки этого курса
- Сортировка векторов с помощью sort()
- order() для гибкой сортировки
- Ранжирование значений с помощью rank()
- Сортировка таблиц данных по столбцу