假设我有n
一行,m
列矩阵A
,我想m
根据某些特定行的排序对每一列重新排序。
例如,如果我取order(A[,k])
,这会给我 column 中元素的数字或字母顺序k
。我现在想A
根据这些排名对矩阵中的每一列进行排序,以便1...n
每一行中的元素被排序以对应1...n
于 column 中的元素(按排名)k
。有没有一种简单的方法可以在不遍历所有列的情况下做到这一点?
假设我有n
一行,m
列矩阵A
,我想m
根据某些特定行的排序对每一列重新排序。
例如,如果我取order(A[,k])
,这会给我 column 中元素的数字或字母顺序k
。我现在想A
根据这些排名对矩阵中的每一列进行排序,以便1...n
每一行中的元素被排序以对应1...n
于 column 中的元素(按排名)k
。有没有一种简单的方法可以在不遍历所有列的情况下做到这一点?
只需使用:
A[order(A[,k]),]
例如:
set.seed(21)
A <- matrix(rnorm(50),10,5)
A[order(A[,1]),]
详细说明@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 列中,
但是 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