私は以下の行列のような行列オブジェクトを持っています。地域間の距離行列ですが、別の順序で並べ替える必要があります。 CLR、LAG、CDA、ANT、CLC。私はいくつかの解決策を プライヤー 彼らは私の場合には役に立たなかった。
ANT CDA CLC CLR LAGM
ANT 0.00 6.45 9.25 6.76 5.41
CDA 6.45 0.00 6.32 4.65 5.31
CLC 9.25 6.32 0.00 6.93 5.91
CLR 6.76 4.65 6.93 0.00 6.76
LAG 5.41 5.31 5.91 6.76 0.00
所望の出力(正しい距離で)
CLR LAGM CDA ANT CLC
CLR
LAG
CDA
ANT
CLC
回答:
回答№1は1できるよ:
m <- read.table(text=
" ANT CDA CLC CLR LAG
ANT 0.00 6.45 9.25 6.76 5.41
CDA 6.45 0.00 6.32 4.65 5.31
CLC 9.25 6.32 0.00 6.93 5.91
CLR 6.76 4.65 6.93 0.00 6.76
LAG 5.41 5.31 5.91 6.76 0.00")
m <- as.matrix(m)
my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
m[my.o, my.o]
# CLR LAG CDA ANT CLC
# CLR 0.00 6.76 4.65 6.76 6.93
# LAG 6.76 0.00 5.31 5.41 5.91
# CDA 4.65 5.31 0.00 6.45 6.32
# ANT 6.76 5.41 6.45 0.00 9.25
# CLC 6.93 5.91 6.32 9.25 0.00
整数インデックスでも行うことができます:
my.o <- c(4,5,2,1,3)
m[my.o, my.o]
あなたの行列のrownamesとcolumnamesの違いの場合、整数インデックスを計算することができます:
my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
ind <- match(my.o, rownames(m))
m[ind, ind]
回答№2の場合は0
処理を適用する前に、私の行列をデータフレームに変換します。並べ替えが簡単になります order
データフレーム内の関数です。とにかく行列をソートするのはよい考えではありません。
この例を考えて、サンプル行列をどのように使用して2つの列をソートし、5つの列しか列挙していないか調べることができます。必要な数の列に変更することができます。
> mat<-matrix(sample(100),nrow=10,ncol=10)
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 36 7 96 65 54 33 95 53 72 67
[2,] 94 45 66 39 46 9 28 10 84 100
[3,] 16 44 58 88 6 12 75 59 74 85
[4,] 97 86 69 64 57 13 78 83 26 63
[5,] 5 27 23 35 42 19 81 2 52 48
[6,] 11 91 22 90 77 89 71 31 50 43
[7,] 25 56 14 40 61 41 99 18 98 21
[8,] 55 30 62 38 92 3 37 8 68 1
[9,] 80 29 34 79 24 17 15 76 70 60
[10,] 4 93 47 87 49 73 20 82 32 51
> x<-as.data.frame(mat)
> x[,c(1:5)][order(x$V3,x$V5),]
V1 V2 V3 V4 V5
7 25 56 14 40 61
6 11 91 22 90 77
5 5 27 23 35 42
9 80 29 34 79 24
10 4 93 47 87 49
3 16 44 58 88 6
8 55 30 62 38 92
2 94 45 66 39 46
4 97 86 69 64 57
1 36 7 96 65 54