Mam obiekt macierzy, który wygląda jak poniższa macierz. Jest to matryca odległości między lokalizacjami, ale muszę je posortować według innej kolejności, na przykład CLR, LAG, CDA, ANT, CLC. Czytałem niektóre rozwiązania z plyr oni nie pracowali w moim przypadku.
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
pożądany wynik (z prawidłowymi odległościami)
CLR LAGM CDA ANT CLC
CLR
LAG
CDA
ANT
CLC
Odpowiedzi:
1 dla odpowiedzi № 1Możesz to zrobić:
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
Możesz to zrobić również z liczbami całkowitymi:
my.o <- c(4,5,2,1,3)
m[my.o, my.o]
W przypadku różnic między rownames i kolumnami twojej macierzy możesz obliczyć liczby całkowite:
my.o <- c("CLR", "LAG", "CDA", "ANT", "CLC")
ind <- match(my.o, rownames(m))
m[ind, ind]
0 dla odpowiedzi nr 2
Chciałbym przekształcić moją matrycę w ramkę danych przed zastosowaniem jakiegokolwiek przetwarzania. Sortowanie staje się proste order
funkcja w ramce danych. W każdym razie sortowanie matrycy nie jest dobrym pomysłem IMHO.
Rozważmy ten przykład i zobaczmy, czy potrafisz zrozumieć, w jaki sposób korzystałem z macierzy próbek i posortowałem ją na 2 z jej kolumn, a wyszczególniłem tylko 5 kolumn. Możesz modyfikować do dowolnej liczby kolumn.
> 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