5

假设我有n一行,m列矩阵A,我想m根据某些特定行的排序对每一列重新排序。

例如,如果我取order(A[,k]),这会给我 column 中元素的数字或字母顺序k。我现在想A根据这些排名对矩阵中的每一列进行排序,以便1...n每一行中的元素被排序以对应1...n于 column 中的元素(按排名)k。有没有一种简单的方法可以在不遍历所有列的情况下做到这一点?

4

2 回答 2

7

只需使用:

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

例如:

set.seed(21)
A <- matrix(rnorm(50),10,5)
A[order(A[,1]),]
于 2012-12-03T20:49:35.257 回答
7

详细说明@joshua 的回答:我认为混淆可能是由于您在上排序但随后将该排序作为索引传递给rows

这可能就是为什么你尝试A[, order(A[,k])] 而不是 A[order(A[,k]),]

order(x)与名称相反,实际上并没有order x,而
只是提供了一个ordering to 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 列中,

  • 第一个元素先出现,
  • 第 4 个元素排在第二位,
  • 第二个元素进入第三个,
  • ETC..

但是 A 列的每个元素都附加到一行。我们需要重新排序行而不是列。

要将排序应用于整个矩阵(或数据框),我们使用排序作为行索引:

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
于 2012-12-03T21:19:23.017 回答