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]]
On Jul 27, 2011, at 6:22 PM, Gene Leynes 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))Try instead: answerBad = lapply(exampBad, function(x) as.matrix(apply(x , 1:1,cumsum))) I also find wrapping as.matrix() around vector results inside a print() call often makes my console output much more to my liking.> 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 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
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 <gleynes+r at 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 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. >