Когда один критерий хорошо упорядочен, функция ранга возвращает очевидную вещь:
rank(c(2,4,1,3,5))
[1] 2 4 1 3 5
Когда у одного критерия есть связи, функция рангов (по умолчанию) присваивает средним рангам связей:
rank(c(2,4,1,1,5))
[1] 3.0 4.0 1.5 1.5 5.0
Функция рангов не позволяет сортировать по нескольким критериям, поэтому вам нужно использовать что-то еще. Один из способов сделать это - использовать совпадение и порядок. Для одного критерия без связей результаты одинаковы:
rank(c(2,4,1,3,5))
[1] 2 4 1 3 5
match(1:5, order(c(2,4,1,3,5)))
[1] 2 4 1 3 5
Однако для одного критерия со связями результаты отличаются:
rank(c(2,4,1,4,5))
[1] 2.0 3.5 1.0 3.5 5.0
match(1:5, order(c(2,4,1,4,5)))
[1] 2 3 1 4 5
Связи разбиваются таким образом, что связанные элементы сохраняют свой первоначальный порядок, а не присваиваются равные ранги. Эта функция, очевидно, обобщается при сортировке по нескольким критериям:
match(1:5, order(c(2,4,1,4,5),c(10,11,12,11,13)))
[1] 2 3 1 4 5
Наконец, вопрос: есть ли простой или встроенный способ вычисления ранга, используя несколько критериев, которые сохраняют связь? Я написал функцию, чтобы сделать это, но это уродливо и кажется смехотворно сложным для такой базовой функциональности...