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.
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.
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.
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.
The order
function should do it.
df[order(df[,1],df[,2],decreasing=TRUE),]
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With