You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:58:38