Create a ranking variable with dplyr?

Ignacio picture Ignacio · Sep 29, 2014 · Viewed 40.7k times · Source

Suppose I have the following data

df = data.frame(name=c("A", "B", "C", "D"), score = c(10, 10, 9, 8))

I want to add a new column with the ranking. This is what I'm doing:

df %>% mutate(ranking = rank(score, ties.method = 'first'))
#   name score ranking
# 1    A    10       3
# 2    B    10       4
# 3    C     9       2
# 4    D     8       1

However, my desired result is:

#   name score ranking
# 1    A    10       1
# 2    B    10       1
# 3    C     9       2
# 4    D     8       3

Clearly rank does not do what I have in mind. What function should I be using?

Answer

A5C1D2H2I1M1N2O1R2T1 picture A5C1D2H2I1M1N2O1R2T1 · Sep 29, 2014

It sounds like you're looking for dense_rank from "dplyr" -- but applied in a reverse order than what rank normally does.

Try this:

df %>% mutate(rank = dense_rank(desc(score)))
#   name score rank
# 1    A    10    1
# 2    B    10    1
# 3    C     9    2
# 4    D     8    3