Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order a matrix by multiple column in r

Tags:

I have a matrix

df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2) rownames(df)<-c("a","b","c","d","e","f")  [,1] [,2] a    3    0 b    7    0 c    5    0 d    0    8 e    1    0 f    0    9 

and I would like to order the matrix in descending order first by column 1 and then by column two resulting in the matrix

df.ordered<-matrix(data=c(7,5,3,1,0,0,0,0,0,0,9,8),ncol=2) rownames(df.ordered)<-c("b","c","a","e","f","d")     [,1] [,2]  b    7    0  c    5    0  a    3    0  e    1    0  f    0    9  d    0    8 

Any suggestions on how I could achieve this? Thanks.

like image 978
Elizabeth Avatar asked Aug 22 '12 16:08

Elizabeth


People also ask

How do I select multiple columns in a matrix in R?

R – Get Multiple Columns of Matrix To get multiple columns of matrix, specify the column numbers as a vector preceded by a comma, in square brackets, after the matrix variable name. This expression returns the required columns as a matrix.

How do I order a dataset by a column in R?

To sort a data frame in R, use the order( ) function. By default, sorting is ASCENDING. Prepend the sorting variable by a minus sign to indicate DESCENDING order.

How do I select multiple columns in R studio?

To pick out single or multiple columns use the select() function. The select() function expects a dataframe as it's first input ('argument', in R language), followed by the names of the columns you want to extract with a comma between each name.


2 Answers

The order function should do it.

df[order(df[,1],df[,2],decreasing=TRUE),] 
like image 183
Joshua Ulrich Avatar answered Sep 20 '22 19:09

Joshua Ulrich


To complete the main answer, here is a way to do it programmatically, without having to specify the columns by hand:

set.seed(2013) # preparing my example mat <- matrix(sample.int(10,size = 30, replace = T), ncol = 3) mat       [,1] [,2] [,3]  [1,]    5    1    6  [2,]   10    3    1  [3,]    8    8    1  [4,]    8    9    9  [5,]    3    7    3  [6,]    8    8    5  [7,]   10   10    2  [8,]    8   10    7  [9,]   10    1    9 [10,]    9    4    5 

As a simple example, let say I want to use all the columns in their order of appearance to sort the rows of the matrix: (One could easily give a vector of indexes to the matrix)

mat[do.call(order, as.data.frame(mat)),]   #could be ..as.data.frame(mat[,index_vec])..       [,1] [,2] [,3]  [1,]    3    7    3  [2,]    5    1    6  [3,]    8    8    1  [4,]    8    8    5  [5,]    8    9    9  [6,]    8   10    7  [7,]    9    4    5  [8,]   10    1    9  [9,]   10    3    1 [10,]   10   10    2 
like image 38
Antoine Lizée Avatar answered Sep 18 '22 19:09

Antoine Lizée