Reputation: 59
How to create rank in data frame based on marks but rank should be separated based on gender:
Sl.no Name Gender Marks Rank
1 aa Male 77 3
2 bb Female 80 2
3 cc Male 74 4
4 dd Female 72 5
5 ee Male 87 1
6 ff Female 80 3
7 gg Male 72 5
8 hh Female 84 1
9 ii Male 82 2
10 jj Female 79 4
Upvotes: 1
Views: 92
Reputation: 887048
We can use a group by operation
library(data.table)
setDT(df1)[order(-Marks), Rank := seq_len(.N), by = Gender]
df1
# Sl.no Name Gender Marks Rank
#1: 1 aa Male 77 3
#2: 2 bb Female 80 2
#3: 3 cc Male 74 4
#4: 4 dd Female 72 5
#5: 5 ee Male 87 1
#6: 6 ff Female 80 3
#7: 7 gg Male 72 5
#8: 8 hh Female 84 1
#9: 9 ii Male 82 2
#10: 10 jj Female 79 4
Or with dplyr
library(dplyr)
df1 %>%
group_by(Gender) %>%
arrange(Gender, desc(Marks)) %>%
mutate(Rank = row_number())
Upvotes: 2