R语言中如何基于另一列的值对指定列进行排名排序
data.table 对val列降序生成排名方法
需求规则
- 基于现有data.table数据集生成排名
- 排名序号1对应
val列最大值,后续序号依次匹配次大值 - 示例数据中排名1对应的val值为181.2349
测试数据集加载
直接运行以下代码即可加载示例数据:
data = structure(list(quant = c(0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.32, 0.34, 0.36, 0.38, 0.4, 0.42, 0.44, 0.46, 0.48, 0.5, 0.52, 0.54, 0.56, 0.58, 0.6, 0.62, 0.64, 0.66, 0.68, 0.7, 0.72, 0.74, 0.76, 0.78, 0.8, 0.82, 0.84, 0.86, 0.88, 0.9, 0.92, 0.94, 0.96, 0.98, 1), val = c(47.91623, 90.3489408, 127.16448, 70.526045, 66.3226236, 85.103976, 139.317196, 127.446425999999, 91.5951164, 86.805257, 111.71706, 79.3636359999997, 73.1136444, 147.4201476, 65.2126171999996, 135.85975, 127.401408, 106.597378999999, 101.1695592, 94.1209831999999, 93.1355219999998, 96.3409336000001, 90.2044183999998, 75.7257826, 147.727516, 80.45166, 102.691942399999, 77.5738932, 62.665275199999, 128.7217, 156.20672, 132.990364, 118.481792, 118.512295599999, 57.3580020000001, 110.16883, 145.284928, 155.691106799999, 134.824147999999, 161.223344, 98.6174559999996, 99.0563548, 131.044792000001, 124.3800214, 99.4231451999992, 154.733724999998, 120.806394399999, 86.9254320000016, 139.611945600001, 181.234905600001, 119.7396)), row.names = c(NA, -51L), class = c("data.table", "data.frame"))
核心实现
优先用data.table内置的frank()函数,性能远高于基础包的rank(),对-val做升序排名就等价于对原val列做降序排名,刚好满足1对应最大值的要求:
# 未安装data.table先运行:install.packages("data.table") library(data.table) # 新增排名列rank_val data[, rank_val := frank(-val)]
如果存在val值重复的场景,可通过ties.method参数调整并列排名规则:
ties.method = "first":重复值按行出现顺序分配不同排名,无并列序号ties.method = "min":重复值取相同的最小排名,后续排名跳号,比如两个并列第1,下一个值排名为3ties.method = "dense":重复值取相同排名,后续排名不跳号,比如两个并列第1,下一个值排名为2
结果校验
运行以下代码按排名升序查看前5行,可确认val=181.2349的记录排名为1,符合规则:
data[order(rank_val), head(.SD, 5)]
内容的提问来源于stack exchange,提问作者Tpellirn
相关产品推荐
相关产品推荐

