Hi Gene: I would encourage you to take some time to write a general-purpose function that does exception handling and deals with one-column matrices properly. Since you have nested lists of matrices, operations like lapply() and perhaps more usefully, rapply(), could well be productive.
Dennis On Thu, Jul 28, 2011 at 9:19 AM, Gene Leynes <gleyne...@gmail.com> wrote: > Dennis, > ninety > > Thanks, I did try almost exactly the same thing. I decided it was too > complicated, especially since I have a whole mess of functions I want to use > this way. You see, I usually work with lists of lists of matrices that are > dimensioned by simulations X time, so there's usually a one column matrix at > the bottom of the list. So, I really want a general solution because I use > it all the time. > > For now I'm going to stick with for loops, they work fine and are more clear > in the unlikely event that anyone else ever looks at my code. The loops > just take up more space / are harder to read. > > for example: > for(i in 1:nrow(mat)) > mat[i,] = cumsum(mat[i,])/(1:ncol(mat)) > > > > On Wed, Jul 27, 2011 at 9:30 PM, Dennis Murphy <djmu...@gmail.com> wrote: >> >> Hi: >> >> Try this: >> >> exampGood = lapply(2:4, function(x) matrix(rnorm(10 * x), ncol = x)) >> exampBad = lapply(1:3, function(x) matrix(rnorm(10 * x), ncol = x)) >> >> csfun <- function(m) { >> if(ncol(m) == 1L) {return(m)} else { >> t(as.matrix(apply(m, 1, cumsum))) >> } >> } >> >> lapply(exampGood, csfun) >> lapply(exampBad, csfun) >> >> HTH, >> Dennis >> >> On Wed, Jul 27, 2011 at 3:22 PM, Gene Leynes <gleyne...@gmail.com> wrote: >> > I have tried a lot of ways around this, but I can't find a way to make >> > apply >> > work in a generalized way because it causes a failure whenever reduces >> > the >> > dimensions of its output. >> > The following example is easier to understand than the question. >> > >> > I wish it had a "drop=TRUE/FALSE" option like the "[" (and I wish I had >> > found the drop option a year ago, and I wish that I had 1e6 dollars... >> > Oops, >> > I mean euros). >> > >> > >> > ## Make three example matricies >> > exampGood = lapply(2:4, function(x)matrix(rnorm(1000*x),ncol=x)) >> > exampBad = lapply(1:3, function(x)matrix(rnorm(1000*x),ncol=x)) >> > ## Two ways to see what was created: >> > for(k in 1:length(exampGood)) print(dim(exampGood[[k]])) >> > for(k in 1:length(exampBad)) print(dim(exampBad[[k]])) >> > >> > ## Take the cumsum of each row of each matrix >> > answerGood = lapply(exampGood, function(x) apply(x ,1,cumsum)) >> > answerBad = lapply(exampBad, function(x) apply(x ,1,cumsum)) >> > str(answerGood) >> > str(answerBad) >> > >> > ## Take the first element of the final column of each answer >> > for(mat in answerGood){ >> > LastColumn = ncol(mat) >> > print(mat[1,LastColumn]) >> > } >> > for(mat in answerBad){ >> > LastColumn = ncol(mat) >> > print(mat[1,LastColumn]) >> > } >> > >> > [[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. >> > > > ______________________________________________ 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.