(As I mentioned in my other reply to Dennis, I think I'll stick with for loops, but I wanted to respond.)
By "almost does it" I meant that using as.matrix helps because it puts the vector into a column, that "almost does it because half the problem is that the output is a non dimensional vector when apply is passed a matrix with one column. However, since the output of the apply function is transposed when youre doing row margins, the as.matrix doesnt help because its putting your result into a column, while the apply function is putting everything else into rows. I tried several combination of using t() before, after, and during (changing margin=1 to margin=2) the function; but none did the trick. I was not as diligent about using your margin=1:1 suggestion in all my trials, that didn't seem to be different from using margin=1. The problem is a bit hard to describe using a natural language, and I think more apparent from the code. Of course, that could my shortcoming. I still think that the structure of the proposed solution, which I think makes the problem apparent. > str(answerProposed) List of 3 $ : num [1:1000, 1] 0.5658 0.1759 1.2444 -0.0456 0.0236 ... $ : num [1:2, 1:1000] 0.0392 0.7047 0.1834 -0.6644 -0.6952 ... $ : num [1:3, 1:1000] -0.835 -0.0461 -0.1725 0.8365 0.7835 ... > I want it to do this: > str(answerDesired) List of 3 $ : num [1, 1:1000,] 0.5658 0.1759 1.2444 -0.0456 0.0236 ... $ : num [1:2, 1:1000] 0.0392 0.7047 0.1834 -0.6644 -0.6952 ... $ : num [1:3, 1:1000] -0.835 -0.0461 -0.1725 0.8365 0.7835 ... > There are a lot of reasons why I would want the apply function to work this way, or at least have an option to work this way. One reason is so that you could perform do.call(rbind, mylist) at the later I guess this behavior is described in the apply documentation: If each call to FUN returns a vector of length n, then apply returns an array of dimension c(n, dim(X)[MARGIN]) if n > 1. If n equals 1, applyreturns a vector if MARGIN has length 1 and an array of dimension dim(X)[MARGIN] otherwise. If nis 0, the result has length 0 but not necessarily the correct dimension. I just wish that it had an option to do return an array of dimension c(n, dim(X)[MARGIN]) if n >= 1 On Wed, Jul 27, 2011 at 8:25 PM, David Winsemius <dwinsem...@comcast.net>wrote: > > On Jul 27, 2011, at 7:44 PM, Gene Leynes wrote: > > David, > > Thanks for the suggestion, but I think your answer only works because I was > printing the wrong thing (because apply with margin=1 transposes the > results, > > > And if you want to change that, then the t() function is readily at hand. > > something I always forget). > > Check this to see what I mean: > str(answerGood) > str(answerBad) > > Adding "as.matrix" is interesting and almost does it, > > > "It" ... What is "it"? In a natural language, ... English preferably. > > -- > david. > > however the results are still transposed. > > Sorry to be confusing with the initial example. > > Here's an updated example (adding as.matrix doesn't make a difference) > > > ## 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)) > answerProposed = lapply(exampBad, function(x) as.matrix(apply(x > ,1:1,cumsum))) > str(answerGood) > str(answerBad) > str(answerProposed) > > ## Take the first element of the final column of each answer > for(mat in answerGood){ > mat = t(mat) ## To get back to 1000 rows > LastColumn = ncol(mat) > print(mat[2,LastColumn]) > } > for(mat in answerBad){ > mat = t(mat) ## To get back to 1000 rows > LastColumn = ncol(mat) > print(mat[2,LastColumn]) > } > for(mat in answerProposed){ > mat = t(mat) ## To get back to 1000 rows > LastColumn = ncol(mat) > print(mat[2,LastColumn]) > } > > > > On Wed, Jul 27, 2011 at 5:45 PM, David Winsemius > <dwinsem...@comcast.net>wrote: > >> >> 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@r-project.org mailing list >>> https://stat.ethz.ch/mailman/**listinfo/r-help<https://stat.ethz.ch/mailman/listinfo/r-help> >>> PLEASE do read the posting guide http://www.R-project.org/** >>> posting-guide.html <http://www.R-project.org/posting-guide.html> >>> and provide commented, minimal, self-contained, reproducible code. >>> >> >> David Winsemius, MD >> West Hartford, CT >> >> > > David Winsemius, MD > West Hartford, CT > > [[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.