我有一个像下面这样的矩阵,但有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
函数,类似于here:
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
函数。
3条答案
按热度按时间ssm49v7z1#
do.call
需要 alist
作为函数调用的参数。 因此,您需要将矩阵的行拆分为列表。函数asplit
可以通过 * 按边距拆分数组或矩阵 * 来实现。asplit
当前(4.2.3)通过选择切片并在for
循环中填充列表来执行此操作。其他选项可以在converting a matrix to a list或Convert a matrix to a list of column-vectors中找到。将一些可能的方法与较大的矩阵进行比较:
结果
方法
data.frame
和lapply
是最快的,splitNrow
分配的额外内存量最少,但asplit
并不落后,更通用,也适用于数组,并允许轻松更改余量。68de4m5k2#
通过修改this answer,使其能够使用大量
t
转换按行排序,您可以执行以下操作:或者,更简单的(根据@Ronak Shah的评论):
kuarbcqp3#
带有
split
的选项