Dear R users I have a 4-dimensional matrix (actually several 3d (x,y, slices) matrices appended over time (volumes)) say, e.g. I want to z-transform the data (subtract the mean and divide by the std-deviation) for (slice in 1:slices) { for (x in 1:x.dim) { for (y in 1:y.dim) { t <- as.matrix(my.matrix[x,y,slice,1:volumes]) for (vol in 1:volumes) { my.matrix.transformed[x,y,slice,vol] <- (my.matrix[x,y,slice,vol] - mean(t))/sqrt(var(t)) } } } } how can I vectorize such a function using, one of the *apply functions? many thanks Cheers Christoph
Hallo Christoph! Using apply and sweep. Both of them accept as the second argument (MARGIN) a vector which specifies the dimension. ?apply ?sweep. To specify the subscripts accurately I always need some trials, and to run tests, so I cant you provide with the final solution. Hope it helps anyway. Sincerely Eryk. *********** REPLY SEPARATOR *********** On 7/20/2004 at 11:31 AM Christoph Lehmann wrote:>>>Dear R users >>> >>>I have a 4-dimensional matrix (actually several 3d (x,y, slices) >>>matrices appended over time (volumes)) >>> >>>say, e.g. I want to z-transform the data (subtract the mean and divide >>>by the std-deviation) >>> >>>for (slice in 1:slices) { >>> for (x in 1:x.dim) { >>> for (y in 1:y.dim) { >>> t <- as.matrix(my.matrix[x,y,slice,1:volumes]) >>> for (vol in 1:volumes) { >>> my.matrix.transformed[x,y,slice,vol] <- >>>(my.matrix[x,y,slice,vol] - mean(t))/sqrt(var(t)) >>> } >>> } >>> } >>>} >>> >>>how can I vectorize such a function using, one of the *apply functions? >>> >>>many thanks >>> >>>Cheers >>> >>>Christoph >>> >>>______________________________________________ >>>R-help at stat.math.ethz.ch mailing list >>>https://www.stat.math.ethz.ch/mailman/listinfo/r-help >>>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.htmlDipl. bio-chem. Eryk Witold Wolski @ MPI-Moleculare Genetic Ihnestrasse 63-73 14195 Berlin 'v' tel: 0049-30-83875219 / \ mail: wolski at molgen.mpg.de ---W-W---- http://www.molgen.mpg.de/~wolski
I think this should do: z <- apply(my.matrix, 1:3, scale) z <- aperm(z, c(2:4, 1)) Andy> From: Christoph Lehmann > > Dear R users > > I have a 4-dimensional matrix (actually several 3d (x,y, slices) > matrices appended over time (volumes)) > > say, e.g. I want to z-transform the data (subtract the mean > and divide > by the std-deviation) > > for (slice in 1:slices) { > for (x in 1:x.dim) { > for (y in 1:y.dim) { > t <- as.matrix(my.matrix[x,y,slice,1:volumes]) > for (vol in 1:volumes) { > my.matrix.transformed[x,y,slice,vol] <- > (my.matrix[x,y,slice,vol] - mean(t))/sqrt(var(t)) > } > } > } > } > > how can I vectorize such a function using, one of the *apply > functions? > > many thanks > > Cheers > > Christoph > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html > >