无需R包,实现多列排序时自动按逆序优先级破tie的方法
R矩阵按从右到左列自动排序的实现方案
针对你需要矩阵按从右至左的列顺序依次排序(最右侧列优先,依次向左列打破平局),且新增列无需手动修改排序参数的需求,提供两种自动化解决方案:
基础R实现
利用do.call()结合列索引反转,自动生成排序规则,无需手动指定每一列:
# 原始矩阵 output <- cbind(c(1, 2, 3, 4, 5), c(1, 1, 2, 3, 1), c(1, 1, 1, 2, 1), c(1, 1, 1, 1, 1)) # 生成从右到左的排序索引 sort_indices <- do.call(order, as.data.frame(output[, rev(seq(ncol(output)))])) # 得到排序后的矩阵 output_1 <- output[sort_indices, ] # 查看结果 output_1
原理说明
rev(seq(ncol(output))):自动生成从最后一列到第一列的索引(比如当前矩阵会生成4,3,2,1),新增列后会自动扩展索引范围do.call(order, ...):把反转后的列作为参数传递给order(),实现按指定顺序排序
tidyverse实现
如果你习惯用dplyr等tidyverse工具,可以用arrange_at()实现自动化排序:
library(dplyr) # 转换为数据框(dplyr更适配数据框操作) output_df <- as.data.frame(output) # 按反转后的列顺序排序 output_1_df <- output_df %>% arrange_at(vars(rev(colnames(.)))) # 转回矩阵(如果需要) output_1 <- as.matrix(output_1_df)
原理说明
vars(rev(colnames(.))):自动获取当前所有列名并反转顺序,新增列后会自动纳入排序规则arrange_at():按指定的列顺序执行排序逻辑
两种方法都能实现新增列时无需手动修改代码,自动按从右到左的列顺序完成排序,最终结果与你给出的output_1完全一致。
内容的提问来源于stack exchange,提问作者Lax Chan
相关产品推荐
相关产品推荐

