It's a very interesting problem. I just wrote a function for it:
order.matrix <- function(m, columnsDecreasing = c('1'=FALSE), rows = 1:nrow(m))
{
if (length(columnsDecreasing) > 0)
{
col <- as.integer(names(columnsDecreasing[1]));
values <- sort(unique(m[rows, col]), decreasing=columnsDecreasing[1]);
unlist(sapply(values, function(x) order.matrix(m,
columnsDecreasing[-1], which((1:nrow(m) %in% rows) & (m[,
col]==x)))));
}
else
{
rows;
}
}
For instance:
m <- matrix( c(2, 1, 1, 3, .5, .3, .5, .2), 4) m
[,1] [,2] [1,] 2 0.5 [2,] 1 0.3 [3,] 1 0.5 [4,] 3 0.2
m[order.matrix(m),]
[,1] [,2] [1,] 1 0.3 [2,] 1 0.5 [3,] 2 0.5 [4,] 3 0.2
m[order.matrix(m, c("1"=FALSE, "2"=TRUE)),]
[,1] [,2] [1,] 1 0.5 [2,] 1 0.3 [3,] 2 0.5 [4,] 3 0.2 Any comment is welcome! ;)
On Wed, May 27, 2009 at 11:04 PM, Linlin Yan <yanlinlin82 at gmail.com> wrote:
m <- matrix( c(2, 1, 1, 3, .5, .3, .5, .2), 4) m
? ? [,1] [,2] [1,] ? ?2 ?0.5 [2,] ? ?1 ?0.3 [3,] ? ?1 ?0.5 [4,] ? ?3 ?0.2
m[unlist(sapply(sort(unique(m[,1])), function(x) which(m[,1]==x)[order(m[(m[,1]==x),2], decreasing=TRUE)])),]
? ? [,1] [,2] [1,] ? ?1 ?0.5 [2,] ? ?1 ?0.3 [3,] ? ?2 ?0.5 [4,] ? ?3 ?0.2 On Wed, May 27, 2009 at 8:39 PM, Paul Geeleher <paulgeeleher at gmail.com> wrote:
I've got a matrix with 2 columns and n rows. I need to sort it first by the values in column 1 ascending. Then for values which are the same in column 1, sort by column 2 decending. For example: 2 .5 1 .3 1 .5 3 .2 Goes to: 1 .5 1 .3 2 .5 3 .2 This is easy to do in spreadsheet programs but I can't seem to work out how to do it in R and haven't been able to find a solution anywhere. Thanks! -Paul. -- Paul Geeleher School of Mathematics, Statistics and Applied Mathematics National University of Ireland Galway Ireland
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.