Переменный ранг, который не пропускает места в R

У меня есть вектор, который выглядит примерно так:

> vec
[1]  1  1  2  5 10

Я пытаюсь преобразовать это в форму неолимпийского рейтинга, где ничья по-прежнему остается ничьей, но ранги гарантированно отличаются на 1, даже если над ним есть несколько ничьих, поэтому:

> f(vec)
[1]  1  1  2  3  4

Скорее, чем:

> rank(vec,ties.method="min")
[1] 1 1 3 4 5

Есть ли функция, которая делает это уже в R? Я знаю, что могу преобразовать значения в факторы, а затем ранжировать факторы, но это кажется немного окольным путем. (Если не функция, то есть ли название для такого ранжирования?)

(Забавно: я не замечал этого раньше, но похоже, что ранг является идемпотентом, что довольно круто:

> rank(vec,ties.method="min")
[1] 1 1 3 4 5
> rank(rank(vec,ties.method="min"),ties.method="min")
[1] 1 1 3 4 5

)


person Mittenchops    schedule 13.03.2014    source источник
comment
Хм, кажется, это называется Dense Ranking en.wikipedia.org/wiki /   -  person Mittenchops    schedule 13.03.2014


Ответы (1)


Попробуй это:

vec <- c(1,1,2,5,10)
> as.integer(factor(vec))
[1] 1 1 2 3 4

Теперь я понимаю, что вы упомянули факторный маршрут. Лично я не нахожу это ужасно оскорбительным.

Или вы можете добраться до кода самого factor и сделать что-то в основном эквивалентное:

match(vec,unique(vec))

но это предполагает, что vec отсортировано, поэтому, возможно, вам действительно придется сделать что-то вроде

match(vec,sort(unique(vec)))
person joran    schedule 13.03.2014