/ / Jaki jest najlepszy sposób sortowania macierzy według kolumny zawierającej nazwy w R? - r, sortowanie, matryca, kolejność

Jaki jest najlepszy sposób sortowania macierzy według kolumny zawierającej nazwy w R? - r, sortowanie, matryca, kolejność

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

Moż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