n
行とm
列の行列があり、特定の行の並べ替えに従ってA
すべての列を並べ替えたいとします。m
たとえば、をとるorder(A[,k])
と、列の要素の番号またはアルファベット順がわかりますk
。ここで、マトリックス内のすべての列A
をそれらのランキングに従って並べ替え、すべての行の要素が列の要素に(ランク別に)1...n
対応するように並べ替えます。すべての列をループせずにこれを行う簡単な方法はありますか?1...n
k
n
行とm
列の行列があり、特定の行の並べ替えに従ってA
すべての列を並べ替えたいとします。m
たとえば、をとるorder(A[,k])
と、列の要素の番号またはアルファベット順がわかりますk
。ここで、マトリックス内のすべての列A
をそれらのランキングに従って並べ替え、すべての行の要素が列の要素に(ランク別に)1...n
対応するように並べ替えます。すべての列をループせずにこれを行う簡単な方法はありますか?1...n
k
使用するだけです:
A[order(A[,k]),]
例えば:
set.seed(21)
A <- matrix(rnorm(50),10,5)
A[order(A[,1]),]
@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内で、
ただし、列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