How to apply a function to all elements with the same indices in multiple arrays? E.g.: I have two spatial grids defined the same way (i.e., same number of rows and columns--and dimensions, both 2D). Wherever both * the value of an element i,j in the first grid is NA * the value of element i,j in the second grid is !NA I want to copy the value from grid2[i,j] to grid1[i,j]. These matrices are not too big, so I'm able to do this with loops, but I know that's not "the R way." How to parallelize/vectorize this, e.g., with a single call to an 'apply'-type method? I believe I know how to operate on a single matrix (e.g., by using `apply` to traverse it by rows or cols), but not how to operate on multiple matrices. Extra points for solutions that generalize to 3D or 4D (i.e., that allow applying the same function to identical elements in n arrays of n dimensions), since I will almost certainly need to work on arrays of those dimensions eventually. Apologies if this is a FAQ, but a fair amount of googling via rseek.org is not finding an answer (perhaps because I'm not using the correct search terms). Feel free (in fact, be encouraged :-) to reply directly to me as well as the list (I'm on the digest, which gets huge). TIA, Tom Roche <Tom_Roche at pobox.com>
Jeff Newmiller
2013-May-09 01:06 UTC
[R] [newbie] *apply to matching elements of n arrays?
Not particularly interested in "points" from you. Would like reproducibility from you [1], including dput of before and after data, and (inefficient) code of course. For loops are part of R.. If your data structure is not set up to take advantage of vectorization, then for loops are generally of the same order of speed as apply functions, and are perfectly usable. You may benefit from sensible memory management optimizations, or from a data reorganization so you can do vector computations. [1] http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity. Tom Roche <Tom_Roche at pobox.com> wrote:> >How to apply a function to all elements with the same indices in >multiple arrays? E.g.: > >I have two spatial grids defined the same way (i.e., same number of >rows and columns--and dimensions, both 2D). Wherever both > >* the value of an element i,j in the first grid is NA >* the value of element i,j in the second grid is !NA > >I want to copy the value from grid2[i,j] to grid1[i,j]. These matrices >are not too big, so I'm able to do this with loops, but I know that's >not "the R way." How to parallelize/vectorize this, e.g., with a >single call to an 'apply'-type method? I believe I know how to operate >on a single matrix (e.g., by using `apply` to traverse it by rows or >cols), but not how to operate on multiple matrices. > >Extra points for solutions that generalize to 3D or 4D (i.e., that >allow >applying the same function to identical elements in n arrays of n >dimensions), since I will almost certainly need to work on arrays of >those dimensions eventually. > >Apologies if this is a FAQ, but a fair amount of googling via >rseek.org is not finding an answer (perhaps because I'm not using the >correct search terms). Feel free (in fact, be encouraged :-) to reply >directly to me as well as the list (I'm on the digest, which gets >huge). > >TIA, Tom Roche <Tom_Roche at pobox.com> > >______________________________________________ >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.
William Dunlap
2013-May-09 04:02 UTC
[R] [newbie] *apply to matching elements of n arrays?
Is the following what you want? It works for vectors or arrays of any number of dimensions. It assumes that the dimensions of the grids are the same.> grid1 <- c(1,2,NA,3,NA) > grid2 <- c(101,102,103,104,NA) > shouldCopy <- is.na(grid1) & !is.na(grid2) > grid1[shouldCopy] <- grid2[shouldCopy] > grid1[1] 1 2 103 3 NA You don't really need the ' & !is.na(grid2)': it just stops the copying of NA elements of grid2 to NA elements of grid1. 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 Tom Roche > Sent: Wednesday, May 08, 2013 5:38 PM > To: r-help at r-project.org > Subject: [R] [newbie] *apply to matching elements of n arrays? > > > How to apply a function to all elements with the same indices in > multiple arrays? E.g.: > > I have two spatial grids defined the same way (i.e., same number of > rows and columns--and dimensions, both 2D). Wherever both > > * the value of an element i,j in the first grid is NA > * the value of element i,j in the second grid is !NA > > I want to copy the value from grid2[i,j] to grid1[i,j]. These matrices > are not too big, so I'm able to do this with loops, but I know that's > not "the R way." How to parallelize/vectorize this, e.g., with a > single call to an 'apply'-type method? I believe I know how to operate > on a single matrix (e.g., by using `apply` to traverse it by rows or > cols), but not how to operate on multiple matrices. > > Extra points for solutions that generalize to 3D or 4D (i.e., that allow > applying the same function to identical elements in n arrays of n > dimensions), since I will almost certainly need to work on arrays of > those dimensions eventually. > > Apologies if this is a FAQ, but a fair amount of googling via > rseek.org is not finding an answer (perhaps because I'm not using the > correct search terms). Feel free (in fact, be encouraged :-) to reply > directly to me as well as the list (I'm on the digest, which gets huge). > > TIA, Tom Roche <Tom_Roche at pobox.com> > > ______________________________________________ > 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.