/ / Rで名前を含む列で行列をソートする最善の方法は? - r、ソート、行列、順序

Rで名前を含む列で行列をソートする最善の方法はどれですか? - r、ソート、行列、順序

私は以下の行列のような行列オブジェクトを持っています。地域間の距離行列ですが、別の順序で並べ替える必要があります。 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