假设我有一个n行,m列矩阵A,我想根据某个特定行的排序重新排序m中的每一列。
例如,如果我接受顺序(A [,k]),则给出了k列中元素的数字或字母顺序。我现在想要根据这些排名对矩阵A中的每一列进行排序,以便每行中的元素1 ... n被排序以对应于列k中的元素1 ... n(按等级)。有没有一种简单的方法可以在不循环遍历所有列的情况下执行此操作?
答案 0 :(得分:7)
只需使用:
A[order(A[,k]),]
例如:
set.seed(21)
A <- matrix(rnorm(50),10,5)
A[order(A[,1]),]
答案 1 :(得分:7)
详细说明@joshua的回答:我认为这可能是因为您在 列 上订购但随后将该订单作为索引传递给的 行 即可。
这可能是您尝试A[, order(A[,k])]
而不是A[order(A[,k]),]
order(x)
与名称相反,实际上并不是 订单 x
,而是提供 < em>订购 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