在矩阵中重新排序列

5
假设我有一个n行,m列的矩阵A,并且我想根据某一特定行的排序重新排列每一列。
例如,如果我使用order(A[,k]),那么它会给我返回第k列元素按数字或字母顺序排列的结果。现在我想根据这些排名对A矩阵中的每一列进行排序,以便每一行中的1…n个元素按照列k中的1…n个元素(按排名)相对应地排序。是否有一种简单的方法来做到这一点,而不需要循环遍历所有列?

1
也许我漏掉了什么,但 A[order(A[,k]),] 不是你想要的吗? - Joshua Ulrich
这是因为你缺少了最后一个逗号。 - Joshua Ulrich
具体来说,让我们取xmat=matrix(c(1,2,4,3,5,6),nrow=2,ncol=3)。我执行order(x[,2]),得到2 1。现在我有x[,order(x[,2])],它会给我一个2x2的矩阵作为输出。 - user1815498
你说你想要对行进行排序,但是你的代码正在对列进行排序。我的代码对行进行排序。 - Joshua Ulrich
@DWin:抱歉,抱歉...老习惯了... - Joshua Ulrich
显示剩余3条评论
2个回答

7

只需使用:

A[order(A[,k]),]

例如:

set.seed(21)
A <- matrix(rnorm(50),10,5)
A[order(A[,1]),]

7
为了阐述@joshua的答案,我认为你可能会因为你正在获取一个的排序值,但是将它作为索引传递给了,从而导致混淆。
这可能是你尝试使用A[, order(A[,k])]代替A[order(A[,k]),]的原因。
与其名称相反,order(x)实际上并不会对x进行排序,而是提供了一个强制执行排序x
例如:
set.seed(1)
A <- matrix(sample(LETTERS[2:8], 24, T), ncol=6)
print(A, quote=F)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] C    C    F    F    G    H   
[2,] D    H    B    D    H    C   
[3,] F    H    C    G    D    F   
[4,] H    F    C    E    G    B    


order(A[, 2])
[1] 1 4 2 3

请注意,输出结果只有4个元素,这是A矩阵的行数而不是列数。
输出结果实际上是在说,在A矩阵的第2列中,第1个元素排在第一位,第4个元素排在第二位,第2个元素排在第三位等等。
但是每个元素都与一行相连。我们需要重新排序的是行而不是列。
为了将该顺序应用于整个矩阵(或数据框),我们使用该顺序作为行索引。
rowIndex <- order(A[, 2])

# Note that these are all equivalent
A[rowIndex,  ]
A[order(A[, 2]),  ]
A[c(1, 4, 1, 3),  ]

最后,我们可以传递多个向量给order(),它会使用后续向量来解决相同的情况。 但是,无论我们从A中给出多少列,order仍将给出一个单一向量,大小与A的行数相等:
# Order according to column 2; ties are left according to their original order
order(A[, 2])
[1] 1 4 2 3

# Order according to column 2; ties are ordered according to column 5
order(A[, 2], A[, 5])
[1] 1 4 3 2

非常有帮助,谢谢。假设我有一个相关矩阵(元素a-d作为行,a-d作为列),我想根据变量k指定的顺序重新排序矩阵(包括列和行)(例如,d、a、b、d而不是a、b、c、d)-- 我该怎么做?谢谢! - Torvon
嗨@Torvon,您可以在Stack Overflow上将您的评论作为新问题发布,只需链接回这个旧问题即可。 - Ricardo Saporta
总是害怕发布可能非常简单的新东西.. 但我会去做。 - Torvon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接