Create a ranking variable with dplyr?

RDplyr

R Problem Overview


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?

R Solutions


Solution 1 - R

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

Solution 2 - R

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(.))))

Solution 3 - R

@user101089 --- you can try out with this alternative way:

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

df %>% mutate(rank_score = dense_rank(desc(score)), rank_score2 = dense_rank(desc(score2)))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIgnacioView Question on Stackoverflow
Solution 1 - RA5C1D2H2I1M1N2O1R2T1View Answer on Stackoverflow
Solution 2 - RPablo CasasView Answer on Stackoverflow
Solution 3 - RGolam Kibria MadhurZaView Answer on Stackoverflow