如何在R中按分组基于两个变量构建排名?frank函数使用遇阻
R按分组基于多变量构建排名的解决方案
从你的示例数据可以看出,排名规则是:按group分组后,先按A降序排序,A值相同时按B降序排序,相同(A,B)组合的排名保持一致。下面针对你提到的frank函数问题和常规实现方法给出解决方案:
1. 使用data.table的frank函数(正确分组用法)
你之前用frank时出错,是因为混淆了frank自身的by参数和data.table的分组参数。frank的by参数是用来设置排序变量的权重,而分组需要通过data.table的by=group来实现。
代码示例:
library(data.table) # 构造示例数据 dt <- data.table( A = c(9,12,12,8,8,10,15,14,14,14), B = c(2,9,10,5,5,3,10,12,8,8), group = c(rep("C",5), rep("D",5)) ) # 按分组计算排名:A降序、B降序,相同值取最小排名 dt[, rank := frank(-A, -B, ties.method = "min"), by = group]
参数说明:
-A、-B:通过取反实现降序排序ties.method = "min":确保相同(A,B)组合的记录使用同一个最小排名(和你的示例结果完全匹配)by = group:指定按group列分组计算
2. 使用dplyr实现(你熟悉的group_by方式)
如果你习惯用dplyr的分组语法,可以结合group_by和min_rank函数实现:
library(dplyr) # 构造示例数据 df <- tibble( A = c(9,12,12,8,8,10,15,14,14,14), B = c(2,9,10,5,5,3,10,12,8,8), group = c(rep("C",5), rep("D",5)) ) # 按分组计算排名 df <- df %>% group_by(group) %>% mutate(rank = min_rank(across(c(A,B), desc))) %>% ungroup()
参数说明:
across(c(A,B), desc):对A和B列都应用降序转换min_rank:生成和示例一致的排名规则(相同值取最小排名)
运行上述代码后,生成的rank列会和你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者Aleya
相关产品推荐
相关产品推荐

