基于反向排名重新分配列值的R语言实现问题求助
问题解决:基于反向排名重新分配列值
你的代码问题出在df$sum_values[order(df$rkr)]的赋值逻辑上——它只是把sum_values按rkr升序的顺序提取出来,但直接赋值给原数据框列时,是按原行顺序分配的,自然不符合反向排名匹配的预期。
修正方案
核心思路是:先把sum_values按降序排列(对应反向排名的顺序),再用每行的反向排名rkr作为索引,从这个降序序列中取值,就能实现按反向排名分配值的需求。
修正后的完整代码:
df <- data.frame(sum_values = c(1, 20, 11, 30, 5)) df$rk <- rank(df$sum_values) # 计算sum_values的原始排名 df$rkr <- length(df$rk) + 1 - df$rk # 计算反向排名 # 关键修正:降序排序sum_values,用rkr索引匹配对应值 sorted_sum_desc <- sort(df$sum_values, decreasing = TRUE) df$sum_reversed <- sorted_sum_desc[df$rkr]
运行结果
最终df的内容如下:
| sum_values | rk | rkr | sum_reversed |
|---|---|---|---|
| 1 | 1 | 5 | 1 |
| 20 | 3 | 3 | 11 |
| 11 | 2 | 4 | 5 |
| 30 | 5 | 1 | 30 |
| 5 | 4 | 2 | 20 |
可以看到,反向排名rkr=1对应最大的sum_values(30),rkr=2对应第二大的(20),完全符合按反向排名分配值的需求。
简化写法
如果不需要保留rk和rkr列,还可以直接用一行代码完成:
df$sum_reversed <- sort(df$sum_values, decreasing = TRUE)[rank(df$sum_values)]
内容的提问来源于stack exchange,提问作者ePoQ
相关产品推荐
相关产品推荐

