R语言中如何按镜像列值自定义数据集行排序?
解决按nodepair及ES1/ES2镜像组合排序的问题
要实现你需要的排序逻辑,核心是先按nodepair分组,再将ES1和ES2的镜像组合视为同一组排序,组内优先排列ES1 < ES2的记录。可以用dplyr包完成这个操作:
首先加载dplyr:
library(dplyr)
执行排序代码:
Tab2 <- Tab1 %>% # 先按nodepair排序分组 arrange(nodepair) %>% # 生成镜像组标识和组内排序标记 mutate( # 同一镜像组的最小/最大值,把(ES1,ES2)和(ES2,ES1)归为一组 min_es = pmin(ES1, ES2), max_es = pmax(ES1, ES2), # 标记组内顺序:ES1小于ES2的记录排前面 pair_order = ifelse(ES1 < ES2, 1, 2) ) %>% # 按分组、镜像组、组内顺序排序 arrange(nodepair, min_es, max_es, pair_order) %>% # 删除临时辅助列 select(-min_es, -max_es, -pair_order)
代码说明
- 按nodepair分组排序:第一步
arrange(nodepair)确保所有相同nodepair的记录集中在一起。 - 生成镜像组键:
min_es和max_es将任意(ES1,ES2)组合转换为有序对,比如(3,4)和(4,3)会被映射到同一个组(min=3,max=4)。 - 组内顺序控制:
pair_order标记让ES1 < ES2的记录在同一镜像组内优先排列,符合你给出的目标结果顺序。 - 最终排序:通过
arrange(nodepair, min_es, max_es, pair_order)完成多层排序,最后移除辅助列得到目标数据集。
运行上述代码后,Tab2的结构和顺序会完全匹配你提供的预期结果。
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

