简体   繁体   中英

Arrange a matrix with regard to the rownames and colnames

Image we have a matrix, M*N, M rows and N columns, like

  b a d c e
a 2 1 4 3 5
b 3 2 5 4 6
c 1 3 3 2 4

I want to write a function, where take the above matrix, return the following matrix:

  a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4

Where the first part of the matrix M*M, 3*3 in this case is symmetric in terms of rownames and colnames, and 3*5 in total, the rest 3*2 matrix is pushed afterwards.

For an N x M matrix where N <= M and all row names are contained in col names, this will bring the columns with names existing in row names to the front in the same order as the row names, and leave the rest of the columns in their original order after that:

mat_ord <- function(mx) mx[, c(rownames(mx), setdiff(colnames(mx), rownames(mx)))]
mat_ord(mx)

produces:

  a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4    

To see the difference, consider mx2 which has rows and columns ordered differently than mx:

  e a b d c
b 6 2 3 5 4
a 5 1 2 4 3
c 4 3 1 3 2    

And with mat_ord(mx2) we get:

  b a c e d
b 3 2 4 6 5
a 2 1 3 5 4
c 1 3 2 4 3

UPDATE: this sorts rows and columns while ensuring symmetry on first N cols/rows:

mat_ord2 <- function(mx) mx[sort(rownames(mx)), c(sort(rownames(mx)), sort(setdiff(colnames(mx), rownames(mx))))]
mat_ord2(mx2)

produces:

  a b c d e
a 1 2 3 4 5
b 2 3 4 5 6
c 3 1 2 3 4

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM