[R] select element from each row of the matrix

William Dunlap wdunlap at tibco.com
Wed Jul 20 23:33:54 CEST 2011


Looping over the rows, as David did below, is one way.
You can also loop over the columns.  This can be faster
when nrow(matrix)>>ncol(matrix).  E.g., with the
following 2 functions

  f0 <- function (x) {
    apply(x, 1, function(aRow) which(aRow <= 5)[1])
  }
  f1 <- function (x) {
      isGood <- !is.na(x) & x <= 5
      retval <- rep(NA, nrow(x))
      for (col in rev(seq_len(ncol(x)))) {
          retval[isGood[, col]] <- col
      }
      retval
  }
and a 1 million row (by 5 column) matrix
  set.seed(1)
  mBig <- matrix(sample(10,size=5*10^6,replace=TRUE), ncol=5, nrow=10^6) 
  mBig[sample(length(mBig), size=length(mBig)/10)] <- NA
I get
  > system.time(z0 <- f0(mBig))
     user  system elapsed 
    17.84    0.02   17.36 
  > system.time(z1 <- f1(mBig))
     user  system elapsed 
     0.56    0.01    0.56 
  > identical(z0,z1)
  [1] TRUE

In either case it can save time (and sometimes use extra memory)
to compute things outside of the loop.  f1 already does that but
f0 would be a bit quicker if you moved some repeated calculations
out of the loop:
  f0a <- function (x) 
  {
      s <- seq_len(ncol(x))
      apply(!is.na(x) & x <= 5, 1, function(aRow) s[aRow][1])
  }

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of David Winsemius
> Sent: Wednesday, July 20, 2011 1:35 PM
> To: gallon li
> Cc: R-help at r-project.org
> Subject: Re: [R] select element from each row of the matrix
> 
> 
> On Jul 20, 2011, at 4:23 PM, gallon li wrote:
> 
> > I have a 5 column matrix like
> >
> > 12 10 8 6 3
> > 10 9 8 7 5
> > 14 NA 4 NA NA NA
> > 15 NA 10 NA 5
> > ...
> 
> Probably something along the lines of
> 
> aapply(mtx, 1, function(x) { c( x[ which(x <= 5)[1] ], # first row are
> the values
>                                  which(x <= 5)[1])  } ) # second row
> the positions
> 
> --
> David.
> 
> >
> > I want to select the position of the first entry for each row <=5
> >
> > for example, for the first row, I want to select the last element
> > and return
> > its position as 5;
> > for th e third row, I want to select the third element and return its
> > position as 3;
> > similarly for the 4th row, I want to select the fifth element and
> > return its
> > position 5.
> >
> > I am wondering how to do this fast? Thanks a lot!
> >
> > 	[[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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.
> 
> David Winsemius, MD
> West Hartford, CT
> 
> ______________________________________________
> 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.



More information about the R-help mailing list