[R] avoiding a loop
chao gai
chaogai at duineveld.demon.nl
Thu Oct 26 17:58:40 CEST 2006
Mark,
This is hardly a one-liner. It will only help you if you call it with large
objects. If you have 0 in your data it needs even more extending.
Here it is:
myconstruct <- function(aa) {
aa <- c(1,1,aa,1)
bb <- cumprod(aa)
taa <- aa<1
difftaa <- diff(taa)
starts <- which(c(FALSE,difftaa==1))
ends <- which(c(FALSE,difftaa==-1))
correction <- rep(0,length(aa))
correction[starts] <- 1/bb[starts-2]
correction[ends] <- -1/bb[starts-2]
correction <- cumsum(correction)
correction[correction==0] <- 1
correction
bbcor <- bb*correction
bbcor[!taa] <- aa[!taa]
bbcor[c(-1,-2,-length(bbcor))]
}
aa <- runif(10000,min=.5,max=1.5)
system.time(target <- constructLt(aa))
system.time(found <- myconstruct(aa))
identical(target,found)
max(abs(target-found))
> system.time(target <- constructLt(aa))
[1] 0.059 0.001 0.059 0.000 0.000
> system.time(found <- myconstruct(aa))
[1] 0.013 0.000 0.014 0.000 0.000
> identical(target,found)
[1] FALSE
> max(abs(target-found))
[1] 4.440892e-16
>
Appearently the outcome is different is some low decimal, due to other
calculation method.
Kees
On Tuesday 24 October 2006 20:36, Leeds, Mark (IED) wrote:
> I think I asked a similar question 3 years ago to the Splus list and I
> think the answer was no or noone answered so noone should spend more
> than 5 minutes on this
> because it could definitely be a waste of time.
>
> My question is whether the function below can be rewritten without a for
> loop. apply is fine if it can be done that way but i doubt it. I call it
> a lot and would
> prefer to not loop.
>
> #-----------------------------------------------------------------------
> --------------------------
>
> constructLt<-function(invector) {
>
> outvector<-invector
>
> for ( i in 2:length(invector) ) {
> if ( invector[i] < 1 ) {
> outvector[i]<-invector[i]*outvector[i-1]
> }
> }
>
> return(outvector)
>
> }
>
> #-----------------------------------------------------------------------
> -------------------------
> --------------------------------------------------------
>
> This is not an offer (or solicitation of an offer) to buy/sell the
> securities/instruments mentioned or an official confirmation. Morgan
> Stanley may deal as principal in or own or act as market maker for
> securities/instruments mentioned or may advise the issuers. This is not
> research and is not from MS Research but it may refer to a research
> analyst/research report. Unless indicated, these views are the author's
> and may differ from those of Morgan Stanley research or others in the Firm.
> We do not represent this is accurate or complete and we may not update
> this. Past performance is not indicative of future returns. For
> additional information, research reports and important disclosures, contact
> me or see https://secure.ms.com/servlet/cls. You should not use e-mail to
> request, authorize or effect the purchase or sale of any security or
> instrument, to send transfer instructions, or to effect any other
> transactions. We cannot guarantee that any such requests received via !
> e-mail will be processed in a timely manner. This communication is solely
> for the addressee(s) and may contain confidential information. We do not
> waive confidentiality by mistransmission. Contact me if you do not wish to
> receive these communications. In the UK, this communication is directed in
> the UK to those persons who are market counterparties or intermediate
> customers (as defined in the UK Financial Services Authority's rules).
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
More information about the R-help
mailing list