为了阐述@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])
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[order(A[,k]),]
不是你想要的吗? - Joshua Ulrich