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-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf Of David Winsemius > Sent: Wednesday, July 20, 2011 1:35 PM > To: gallon li > Cc: R-help@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@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@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. ______________________________________________ R-help@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.