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