/ / Welches ist der beste Weg, um eine Matrix nach Spalten mit Namen in R zu sortieren? - r, Sortieren, Matrix, Reihenfolge

Welches ist der beste Weg, um eine Matrix nach Spalten mit Namen in R zu sortieren? - r, Sortieren, Matrix, Reihenfolge

Ich habe ein Matrixobjekt, das wie die folgende Matrix aussieht. Es ist eine Distanzmatrix zwischen Lokalitäten, aber ich muss sie nach einer anderen Reihenfolge sortieren, etwa nach CLR, LAG, CDA, ANT, CLC. Ich lese einige Lösungen mit Verp mit denen haben sie in meinem Fall nicht funktioniert.

    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

gewünschte Ausgabe (mit den richtigen Abständen)

     CLR    LAGM    CDA ANT CLC
CLR
LAG
CDA
ANT
CLC

Antworten:

1 für die Antwort № 1

Du kannst tun:

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

Sie können dies auch mit ganzzahligen Indizes tun:

my.o <- c(4,5,2,1,3)
m[my.o, my.o]

Bei Unterschieden zwischen rownames und columnames Ihrer Matrix können Sie die ganzzahligen Indizes berechnen:

my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
ind <- match(my.o, rownames(m))
m[ind, ind]

0 für die Antwort № 2

Ich würde meine Matrix in einen Datenrahmen umwandeln, bevor ich irgendeine Verarbeitung anwende. Sortieren wird dann einfach order Funktion in einem Datenrahmen. Wie auch immer, das Sortieren einer Matrix ist keine gute Idee.

Betrachten Sie dieses Beispiel und sehen Sie, ob Sie herausfinden können, wie ich eine Beispielmatrix verwendet und nach 2 Spalten sortiert habe und nur 5 Spalten aufgelistet habe. Sie können beliebig viele Spalten ändern.

> 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