On 2010-07-03, at 17:43 , Peter Ehlers wrote: > > On 2010-07-03 0:05, Godfrey van der Linden wrote: >> G'day, All. >> >> I have been trying to trackdown a problem in my R analysis script. I perform >> a scale() operation on a matrix then do further work. >> >> Is there any way of inverting the scale() such that >> sX<- scale(X) >> Xprime<- inv.scale(x); # does inv.scale exist? >> >> resulting in Xprime_{ij} == X_{ij} where Xprime_{ij} \in R >> >> There must be some way of doing it but I'm such a newb that I haven't been >> able to find it. >> >> Thanks >> >> Godfrey >> > > If your sX hasn't lost the "scaled:center" and > "scaled:scale" attributes that it got from the > scale() operation, then you can just reverse > the scaling procedure using those. Multiply > columns by the "scale" attribute, then add the > "center" attribute. Something like: > > MN <- attr(sx, "scaled:center") > SD <- attr(sx, "scaled:scale") > Xprime <- t(apply(sx, 1, function(x){x * SD + MN})) > > If the attributes have been lost by your further > work, then I'm afraid you're out of luck. > > -Peter Ehlers
Thanks for this, I had forgotten the transpose function existed. I did maintain the attributes, though I was surprised how many times I had to move them manually in my script. Anyway I also tried a functional programming solution and I'm sort of curious what the differences are? I used rep to build out the SD and MN vectors. Something like this (though I have lost the precise code now and would have to regenerate it) nr = nrow(sx) Xprime = sx * rep(SD, each=nr) + rep(MN, each=nr); Is there any way of determining which approach is more efficient? Thanks again. Godfrey ______________________________________________ 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.