/ / ¿Cuál es la mejor manera de ordenar una matriz por columna que contiene nombres en R? - r, ordenación, matriz, orden

¿Cuál es la mejor manera de ordenar una matriz por columna que contiene nombres en R? - r, clasificación, matriz, orden

Tengo un objeto de matriz que se parece a la matriz de abajo. Es una matriz de distancia entre localidades, pero necesito ordenarlas según otro orden, algo así como CLR, LAG, CDA, ANT, CLC. Leí algunas soluciones con plyr con ellos no trabajaron en mi caso.

    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

Salida deseada (con las distancias correctas)

     CLR    LAGM    CDA ANT CLC
CLR
LAG
CDA
ANT
CLC

Respuestas

1 para la respuesta № 1

Tu puedes hacer:

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

Puedes hacerlo también con índices enteros:

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

En el caso de diferencias entre los nombres comunes y los nombres de columna de su matriz, puede calcular los índices enteros:

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

0 para la respuesta № 2

Yo convertiría mi matriz en un marco de datos antes de aplicar cualquier procesamiento. Ordenar entonces se convierte en un sencillo order Función en un marco de datos. De todos modos, ordenar una matriz no es una buena idea en mi humilde opinión.

Considere este ejemplo y vea si puede entender cómo he usado una matriz de muestra y ordenado en 2 de sus columnas y enumerado solo 5 columnas. Puede modificar tantas columnas como desee.

> 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