Create a ranking variable with dplyr?

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?


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

Other solution when you need to apply the rank to all variables (not just one).

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

select(df, -name) %>% mutate_all(funs(dense_rank(desc(.))))