CodeGuy
CodeGuy

Reputation: 28907

Sort rows in matrix, based on relative order of columns within each row

I have a matrix in R that has N rows and 6 columns. I'd like to sort the rows by that row's maximum value.

Specifically, I'd like to first identify all the rows that have the highest value (for that row) in column 1, and those should appear first in the matrix. Next, I'd like to identify all the rows that have the highest value in column 2 (for that row), and those should appear next in the matrix. And so on.

How can I do this?


Example case: Let's say I have the matrix

1 2 3 4 5 6
3 5 4 4 3 5
7 1 2 3 2 4

Then the result of the sorting would place the first row at the end, because it's highest value is in the last column. It would place the 3rd row first, because it's higest value is in the first column. And it would place the middle row in between, because it's highest value is in the 2nd column. Result:

7 1 2 3 2 4
3 5 4 4 3 5
1 2 3 4 5 6

Upvotes: 3

Views: 405

Answers (1)

thelatemail
thelatemail

Reputation: 93813

Use max.col and order:

mat[ order(max.col(mat, "first")), ]

#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    7    1    2    3    2    4
#[2,]    3    5    4    4    3    5
#[3,]    1    2    3    4    5    6

Where mat was:

mat <- structure(c(1L, 3L, 7L, 2L, 5L, 1L, 3L, 4L, 2L, 4L, 4L, 3L, 5L, 
3L, 2L, 6L, 5L, 4L), .Dim = c(3L, 6L))

It works because it calculates:

\1. Column position of the maximum value in each row:

max.col(mat, "first")
#[1] 6 2 1

\2. The order of rows based on these maximum values:

order(max.col(mat, "first"))
#[1] 3 2 1

Upvotes: 7

Related Questions