使用dplyr按主组为子组分配统一唯一排名的实现方法
按主组为子组分配统一排名的tidyverse实现方案
library(tidyverse) # 构造输入数据 my_df <- tibble( var1 = c(rep("A", 8), rep("B", 12)), var2 = c(rep("long_string_x", 4), rep("long_string_y", 4), rep("long_string_x", 4), rep("long_string_y", 4), rep("long_string_z", 4)) ) # 核心计算逻辑 my_df <- my_df %>% # 按主组var1分组,不同主组的排名独立计算互不干扰 group_by(var1) %>% # 对组内var2做密集排名,相同var2值返回相同排名,排名序列连续无跳号 mutate(group_rank = dense_rank(var2)) %>% # 可选:取消分组,避免后续操作受残留分组影响 ungroup()
补充说明
- 核心调用
dplyr::dense_rank()函数实现子组统一排名,运行后输出结果和需求中的期望格式完全一致 - 若需要自定义子组的排名顺序(不使用
var2默认的字典序),可先将var2转为指定level顺序的因子,再执行排名即可,自定义顺序示例:
# 自定义var2的排名顺序为 z > y > x my_df %>% mutate(var2 = factor(var2, levels = c("long_string_z", "long_string_y", "long_string_x"))) %>% group_by(var1) %>% mutate(group_rank = dense_rank(var2)) %>% ungroup()
内容的提问来源于stack exchange,提问作者Rob Creel
相关产品推荐
相关产品推荐

