如何在R语言中对任意行数的矩阵按行排序?
问题描述
我有一个如下所示的矩阵,但实际为n行:
set.seed(123) mt <- replicate(5, sample(1:3, 4, replace = TRUE)) mt #> [,1] [,2] [,3] [,4] [,5] #> [1,] 3 3 3 1 3 #> [2,] 3 2 1 2 3 #> [3,] 3 2 2 3 1 #> [4,] 2 2 2 1 1
我使用order函数按行排序,代码如下:
od2 <- order(mt[1, ], mt[2, ], mt[3, ], mt[4, ]) mt[, od2] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 1 3 3 3 3 #> [2,] 2 1 2 3 3 #> [3,] 3 2 2 1 3 #> [4,] 1 2 2 1 2
请问如何将代码适配到n行的情况?我尝试相关方法未成功,且不熟悉do.call函数。
解决方案
要适配任意行数的矩阵,无需手动逐个指定每行作为order参数,用do.call即可实现自动传入所有行作为参数。do.call的核心作用是将列表的元素依次作为指定函数的参数传递。
方法一:转置矩阵后转成数据框传入
# 生成任意n行的示例矩阵 set.seed(123) n <- 5 mt <- replicate(5, sample(1:3, n, replace = TRUE)) # 生成排序索引并重新排列列 od <- do.call(order, as.data.frame(t(mt))) mt_sorted <- mt[, od] # 查看排序结果 mt_sorted
原理:t(mt)将矩阵转置,原矩阵的行变为列;转成数据框后,数据框的每一列对应原矩阵的一行,do.call(order, 数据框)会自动把每一列作为order的参数,等价于手动输入mt[1,], mt[2,], ..., mt[n,]。
方法二:直接拆分矩阵行成列表传入
od <- do.call(order, split(mt, seq(nrow(mt)))) mt_sorted <- mt[, od]
原理:split(mt, seq(nrow(mt)))将矩阵按行拆分为列表,每个列表元素是一行的向量;do.call会把这些向量依次传给order函数,达到和手动输入一致的效果。
内容的提问来源于stack exchange,提问作者Wael
相关产品推荐
相关产品推荐

