# 基于多个变量计算排名 [英] Calculate rank with ties based on more than one variable

### 问题描述

I'm trying to compute a medal table for a sports event.

``````test <- data.frame("ID" = c("1_1", "1_2", "1_3", "1_4","1_5","1_6"),
"gold"=c(10, 4, 1, 7, 7, 1),
"silver"=c(1, 3, 2, 19, 19, 2),
"bronze"=c(1, 8, 2, 0, 0, 2))
``````

First, I want to order the data based on number of "gold", "silver", and "bronze", like this:

``````(test_ordered <- with(test, test[order(-gold, -silver, -bronze), ]))
``````

Then compute the final medal rank. This is how the final rank column should like:

``````(test_ordered\$rank<-c(1, 2, 2, 4, 5, 5))

#    ID gold silver bronze rank
# 1 1_1   10      1      1    1
# 4 1_4    7     19      0    2
# 5 1_5    7     19      0    2
# 2 1_2    4      3      8    4
# 3 1_3    1      2      2    5
# 6 1_6    1      2      2    5
``````

As ID "1_4" and "1_5" have the won the same combination of medals they'd share rank 2, e.g.

My attempts using more than two criteria with `rank` (also `dplyr::min_ranked`) failed:

``````with(test, rank(-gold, -silver, -bronze, ties.method = "min"))
# (...) unused argument (-bronze)
``````

``````as.numeric(interaction(gl(-test\$gold), gl(-test\$silver), gl(-test\$bronze), lex.order = TRUE))
``````

Any ideas how to calculate rank based on multiple variables?

``````as.data.frame(setDT(test)[ , rank := frank(test, -gold, -silver, -bronze, ties.method = "min")]; setorder(test, rank))
``````

### 推荐答案

``` You may use the data.table equivalent of base::rank, frank. A nice feature with frank is that it accepts, not only vectors (as in rank), but also a data.frame or a data.table as input. For these types of objects, the rank may be based on several columns. 使用您原来的data.frame: test\$rank <- data.table::frank(test, -gold, -silver, -bronze, ties.method = "min") 或者，如果您想全部使用 data.table 函数: Or if you want to go all in with data.table functions: setDT(test)[ , rank := frank(test, -gold, -silver, -bronze, ties.method = "min")] setorder(test, rank) 这篇关于基于多个变量计算排名的文章就介绍到这了，希望我们推荐的答案对大家有所帮助，也希望大家多多支持IT屋！ ```
``` 查看全文 ```
``` ```
``` ```
``` (adsbygoogle = window.adsbygoogle || []).push({}); 相关文章 变量计算值; 如何基于DateTime和其他变量计算SQL？; HSL值的CSS变量计算; CSS3与变量计算; 大量计算方差; 运动矢量计算; 用java中的char变量计算; Matlab - 图像动量计算; 装配偏移量计算规则; C - 测量计算时间; 用利率向量计算复利; 从向量计算速度; 如何从指针变量计算数组的大小?; 如何从指针变量计算数组的大小?; 用模量计算大功率; 代码度量计算在Visual Studio; Jmeter中的吞吐量计算; 通过 id 变量计算滚动总和，缺少时间点; 通过id变量计算滚动总和，缺少时间点; 声明未设置但是变量计算结果为真？; Pinescrip策略退出和订货量计算; C ++矢量计算每个元素的出现; 用户界面因大量计算而冻结; 基于数量计算的产品类别的购物车折扣; Swift 中的惰性变量计算不止一次吗?; (adsbygoogle = window.adsbygoogle || []).push({}); ```
``` 其他开发最新文章 拒绝显示一个框架，因为它将'X-Frame-Options'设置为'sameorigin'; 什么是＆QUOT; AW＆QUOT;在部分标志属性是什么意思？; 在运行npm install命令时获取'npm WARN弃用'警告; cmake无法找到openssl; 从Spark的scala中的* .tar.gz压缩文件中读取HDF5文件; Twitter :: Error :: Forbidden - 无法验证您的凭据; 我什么时候需要一个fb：app_id或者fb：admins？; 将.db文件导入R; npm通知创建一个lockfile作为package-lock.json。你应该提交这个文件; 拒绝执行内联脚本，因为它违反了以下内容安全策略指令：“script-src'self'”; 热门教程 Java教程 Apache ANT 教程 Kali Linux教程 JavaScript教程 JavaFx教程 MFC 教程 Apache HTTP客户端教程 Microsoft Visio 教程 热门工具 Java 在线工具 C(GCC) 在线工具 PHP 在线工具 C# 在线工具 Python 在线工具 MySQL 在线工具 VB.NET 在线工具 Lua 在线工具 Oracle 在线工具 C++(GCC) 在线工具 Go 在线工具 Fortran 在线工具 ```
``` var eskeys = '基于,多个,变量,计算,排名'; var cat = 'other-dev'; ```
``` 登录 关闭 扫码关注1秒登录 发送“验证码”获取 | 15天全站免登陆 友情链接： IT屋 Chrome插件 谷歌浏览器插件 IT屋 ©2016-2022 琼ICP备2021000895号-1 站点地图 站点标签 SiteMap <免责申明> 本站内容来源互联网,如果侵犯您的权益请联系我们删除. var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?0c3a090f7b3c4ad458ac1296cb5cc779"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); ```