如何对多列DataFrame按指定层级规则执行mixedsort混合排序?
R语言实现DataFrame多层级混合排序(仿Excel效果)
排序需求
- Level.1:字母数字混合类型,先按0-100数字升序排列,再按a-z字母升序排列
- Level.2:按字母顺序升序排列
- Level.3与Level.4求和后的值,按从小到大升序排列
- Level.5:按日期升序排列(原数据为Excel日期序列号)
测试数据集
Treaty <- data.frame( Level.1 = c(1, 3, 1, 1, 41, 66, 87, 94, "a", "b", "c", "d", "e", "f"), Level.2 = c("P", "E", "P", "E", "P", "E", "P", "E", "P", "E", "P", "E", "P", "E"), Level.3 = c(0, 0, 500, 0, 0, 0, 0, 0, 7000, 8000, 9000, 10000, 1000, 2000), Level.4 = c(9000, 10000, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 1000, 2000), Level.5 = c(44689, 44570, 44620, 44805, 44720, 44624, 44749, 44745, 44810, 44813, 44683, 44561, 44601, 44626) )
解决方案
利用gtools包中的mixedorder函数实现Level.1的混合排序,同时按要求处理其他层级的排序逻辑:
# 如果未安装gtools包,先执行安装 # install.packages("gtools") library(gtools) # 1. 计算Level.3与Level.4的合并值,作为排序键 Treaty$combined_L3L4 <- Treaty$Level.3 + Treaty$Level.4 # 2. 将Level.5的Excel日期序列号转换为日期类型 Treaty$Level.5_date <- as.Date(Treaty$Level.5, origin = "1899-12-30") # 3. 生成排序索引,按需求的层级顺序排序 sorted_index <- mixedorder( Treaty$Level.1, # 第一层级:混合排序 Treaty$Level.2, # 第二层级:字母顺序 Treaty$combined_L3L4, # 第三层级:合并值升序 Treaty$Level.5_date # 第四层级:日期升序 ) # 4. 获取排序后的DataFrame sorted_Treaty <- Treaty[sorted_index, ] # 可选:删除临时生成的辅助列 sorted_Treaty <- sorted_Treaty[, !names(sorted_Treaty) %in% c("combined_L3L4", "Level.5_date")] # 查看结果 print(sorted_Treaty)
代码说明
mixedorder:专门处理字母数字混合类型的排序,自动先按数值大小排列数字部分,再按字典序排列字母部分,匹配Level.1的排序需求combined_L3L4:临时计算Level.3与Level.4的和,作为第三层级的排序依据as.Date(..., origin="1899-12-30"):将Excel日期序列号转换为R标准日期类型,确保日期排序逻辑准确
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

