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 № 1Du 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