Murali.MENON at fortisinvestments.com
2010-Jan-20 16:57 UTC
[R] min and max operations on matrix
Folks, I've got a matrix x as follows:> x <- matrix(c(1,2,3,5,3,4,3,2,1), ncol = 3, byrow = TRUE) > x[,1] [,2] [,3] [1,] 1 2 3 [2,] 5 3 4 [3,] 3 2 1 In each row of x, I want to replace the minimum value by -1, the maximum value by +1 and all other values by 0. So in the above case I want to end up as follows: [,1] [,2] [,3] [1,] -1 0 1 [2,] 1 -1 0 [3,] 1 0 -1 I tried the following, which seems to work:> t(apply(x, 1, function(y) {z <- numeric(NROW(y)); z[which.min(y)] <--1; z[which.max(y)]<- 1; z})) Is there a neater way to do this? Thanks, Murali
Try this:> t(apply(x, 1, function(x) (x == max(x)) - (x == min(x))))[,1] [,2] [,3] [1,] -1 0 1 [2,] 1 -1 0 [3,] 1 0 -1 You can avoid the transpose using plyr:> library(plyr) > aaply(x, 1, function(x) (x == max(x)) - (x == min(x)))Var1 1 2 3 1 -1 0 1 2 1 -1 0 3 1 0 -1 On Wed, Jan 20, 2010 at 11:57 AM, <Murali.MENON at fortisinvestments.com> wrote:> Folks, > > I've got a matrix x as follows: > >> x <- matrix(c(1,2,3,5,3,4,3,2,1), ncol = 3, byrow = TRUE) >> x > ? ? [,1] [,2] [,3] > [1,] ? ?1 ? ?2 ? ?3 > [2,] ? ?5 ? ?3 ? ?4 > [3,] ? ?3 ? ?2 ? ?1 > > > In each row of x, I want to replace the minimum value by -1, the maximum > value by +1 and all other values by 0. > > So in the above case I want to end up as follows: > > ? ? [,1] [,2] [,3] > [1,] ? -1 ? ?0 ? ?1 > [2,] ? ?1 ? -1 ? ?0 > [3,] ? ?1 ? ?0 ? -1 > > I tried the following, which seems to work: > >> t(apply(x, 1, function(y) {z <- numeric(NROW(y)); z[which.min(y)] <- > -1; z[which.max(y)]<- 1; z})) > > Is there a neater way to do this? > > Thanks, > > Murali > > ______________________________________________ > 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. >