5

n行とm列の行列があり、特定の行の並べ替えに従ってAすべての列を並べ替えたいとします。m

たとえば、をとるorder(A[,k])と、列の要素の番号またはアルファベット順がわかりますk。ここで、マトリックス内のすべての列Aをそれらのランキングに従って並べ替え、すべての行の要素が列の要素に(ランク別に)1...n対応するように並べ替えます。すべての列をループせずにこれを行う簡単な方法はありますか?1...nk

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の答えを詳しく説明します。で順序付けしているのに、その順序付けをインデックスとしてに渡すという事実から混乱が生じる可能性があると思います。

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内で、

  • 最初の要素が最初になり、
  • 4番目の要素が2番目になります。
  • 2番目の要素は3番目になります。
  • 等..

ただし、列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からの列の数に関係なく、orderAの行の数と同じサイズの単一のベクトルが得られます。

# 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 に答える