R语言实现按PC_achieved、Goal排序并对并列值赋予相同排名
解决方法
你只需要修改mutate里的排名计算逻辑,去掉多余的row_number(),直接基于PC_achieved和Goal的组合来生成并列排名。因为你已经按规则排好序了,只需要让相同组合值的行获得相同排名即可:
library(dplyr) df <- df %>% arrange(desc(PC_achieved), desc(Goal)) %>% mutate( # 通过数值组合确保PC_achieved和Goal都相同的行被归为一组 Rank = min_rank(desc(PC_achieved * 1000 + Goal)) )
或者用更清晰的across语法,不需要手动构造数值组合:
df <- df %>% arrange(desc(PC_achieved), desc(Goal)) %>% mutate( Rank = min_rank(across(c(PC_achieved, Goal), ~ desc(.x))) )
原代码问题出在哪
你之前写的min_rank(row_number())完全是画蛇添足:row_number()会给每一行分配1到6的唯一序号,哪怕两行的PC_achieved和Goal完全一致,序号也不一样,所以min_rank处理后还是会生成唯一排名,这就是ID3和4得到5、6不同排名的原因。
验证结果
运行修改后的代码,最终的数据集会是这样:
| ID | PC_achieved | Goal | Rank |
|---|---|---|---|
| 2 | 100 | 500 | 1 |
| 1 | 90 | 500 | 2 |
| 6 | 90 | 200 | 3 |
| 5 | 50 | 600 | 4 |
| 3 | 50 | 500 | 5 |
| 4 | 50 | 500 | 5 |
完全符合你的需求:ID3和4拥有相同的排名5。
内容的提问来源于stack exchange,提问作者BlinkNFG
相关产品推荐
相关产品推荐

