基于r中的另一个矩阵对矩阵进行排序

时间:2017-10-27 15:49:55

标签: r sorting matrix

我有两个矩阵:

A = matrix(c(2,1,3,6,4,3,8,1,6,2,9,5), ncol=4)
B = matrix(c(20,10,30,60,40,30,80,10,60,20,90,50), ncol=4)

现在,我已经按行对矩阵A进行了排序:

A_sorted=t(apply(A,1,sort))

2 2 6 8
1 1 4 9
3 3 5 6

现在,我想按照与A相同的顺序对B矩阵进行排序,这样新的矩阵'B_sorted'将是:

20 20 60 80
10 10 40 90
30 30 50 60

我在过去Sort one matrix based on another matrix找到了类似的答案,但答案中的代码不适用于不同维度的矩阵。

3 个答案:

答案 0 :(得分:2)

我们可以使用for循环遍历行序列,并根据'A'行的order分配'B'行

for(i in seq_len(nrow(A))) B[i,] <- B[i,][order(A[i,])]
B
#     [,1] [,2] [,3] [,4]
#[1,]   20   20   60   80
#[2,]   10   10   40   90
#[3,]   30   30   50   60

答案 1 :(得分:2)

您可以创建使用order(row(A), A)按行对矩阵进行排序的索引,然后使用它重新排序原始矩阵;稍后使用matrix为已排序数据添加维度:

matrix(B[order(row(A), A)], byrow = TRUE, ncol = ncol(B))

#     [,1] [,2] [,3] [,4]
#[1,]   20   20   60   80
#[2,]   10   10   40   90
#[3,]   30   30   50   60

答案 2 :(得分:1)

t(sapply(1:NROW(A), function(i) B[i,][order(A[i,])]))
#     [,1] [,2] [,3] [,4]
#[1,]   20   20   60   80
#[2,]   10   10   40   90
#[3,]   30   30   50   60