You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:34