如何基于两列分组排序创建新列?(优先使用Tidyverse)
解决方案:在分组内生成排序序号列(NewOrder)
使用tidyverse中的dplyr包,通过分组+生成行号的方式可以快速实现需求,核心逻辑是按TotalQuantile分组后,在组内基于TotalOrder的顺序生成连续序号。
核心代码
library(tidyverse) # 替换为你的数据集名称 your_data <- your_data %>% group_by(TotalQuantile) %>% # 按TotalOrder升序生成组内序号 mutate(NewOrder = row_number(TotalOrder)) %>% # 取消分组,避免影响后续操作 ungroup()
代码说明
group_by(TotalQuantile):指定以TotalQuantile作为分组依据,后续的序号生成仅在每个分组内执行mutate(NewOrder = row_number(TotalOrder)):在每个分组内,根据TotalOrder的升序排列生成从1开始的连续序号,赋值给新列NewOrderungroup():执行完分组操作后取消分组,确保后续对数据集的操作不受分组状态影响
样本数据验证
先构造你提供的样本数据:
# 构造样本数据集 sample_data <- tibble( 人数 = c(12, 19, 21, 45, 53, 55, 60, 75), TotalOrder = c(1, 2, 3, 5, 5, 6, 7, 8), TotalQuantile = c(1, 1, 2, 2, 3, 3, 4, 4) )
运行核心代码后,得到的结果如下:
| 人数 | TotalOrder | TotalQuantile | NewOrder |
|---|---|---|---|
| 12 | 1 | 1 | 1 |
| 19 | 2 | 1 | 2 |
| 21 | 3 | 2 | 1 |
| 45 | 5 | 2 | 2 |
| 53 | 5 | 3 | 1 |
| 55 | 6 | 3 | 2 |
| 60 | 7 | 4 | 1 |
| 75 | 8 | 4 | 2 |
处理同组内重复值的情况
如果你的数据中存在同一TotalQuantile分组内TotalOrder值重复的情况,若希望相同TotalOrder对应相同的NewOrder,可以使用rank()函数并指定ties.method参数:
your_data <- your_data %>% group_by(TotalQuantile) %>% # 相同TotalOrder值得到相同序号,后续序号跳过重复计数 mutate(NewOrder = rank(TotalOrder, ties.method = "min")) %>% ungroup()
内容的提问来源于stack exchange,提问作者TeaNoMilk
相关产品推荐
相关产品推荐

