Re: [R] How to optimize this loop ?

From: Martin Becker <martin.becker_at_mx.uni-saarland.de>
Date: Thu 18 Jan 2007 - 14:16:21 GMT

Petr Pikal schrieb:
> Hi
>
> discard your loop do not optimise it.
> rle is your friend
>
I do not agree. For some purposes, an efficient loop is faster. IMHO this is one of these purposes.
I propose the following modification of the loop (to increase speed):

myfun1 <- function(series=c(3, 4, 10,14,8,3,4,6,9)) {   len<-length(series)
  for (i in (len-1):1)
  {
    if (series[i]>series[len])
    { result <- i-1 ; break }
  }
  return(result)
}

The speed measurement, in comparison with the rle approach:

 > system.time(for (i in 1:10000) erg<-my_fun(c(3, 4, 10,14,8,3,4,6,9))) [1] 4.48 0.00 4.48 NA NA

 > system.time(for (i in 1:10000) erg<-myfun1(c(3, 4, 10,14,8,3,4,6,9))) [1] 0.33 0.00 0.33 NA NA

Regards, Martin
>
>> my_fun<-function(x) {
>>
> +
> + len<-length(x)
> + x1<-rle(x[len]>x[1:len-1])
> + last<-length(x1$values)
> + ifelse(x1$values[last],x1$lengths[last],0)
> + }
>
>> my_fun(my_series)
>>
> [1] 0
>
>> my_series <- c(3, 4, 10,14,8,3,4,6,9)
>> my_fun(my_series)
>>
> [1] 4
>
>
> and vectorise, vectorise, vectorise.
>
> HTH
> Petr
>
>
>
>
> On 18 Jan 2007 at 14:11, Nicolas Prune wrote:
>
> Date sent: Thu, 18 Jan 2007 14:11:11 +0100
> From: Nicolas Prune <np@alambic.org>
> To: r-help@stat.math.ethz.ch
> Subject: [R] How to optimize this loop ?
>
>
>> Dear R Users,
>>
>> I request your help to optimize a loop.
>>
>> Given a series of observations, I want to know how many consecutive
>> past observations are below the last one.

>>
>> e.g :
>> my_series <- c(3, 4, 10,14,8,3,4,6,9)
>>
>> As the last number (9) is higher than the four preceding numbers (6,
>> 4, 3, 8), this function should return 4.
>>
>> my_series <- c(3, 4, 10,14,8,3,4,11,9)
>> Here, it should return 0, as 9 is immediately preceeded by a higher
>> number.
>>
>> So far, I do this awful loop :
>>
>> result <- 0
>> for (i in 1:length(my_series-1))
>> {
>> if (my_series[length(my_series)-i]>end(my_series)[1])
>> { result <- i-1 ; break }
>> }
>>
>> I thing there's a better way...
>>
>> my_series > my_series[end][1] returns :
>> TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE
>> , which seems more appealing (once the last "FALSE" is removed), but
>> now, how to know the size of the last consecutive series of "TRUE" ?
>>
>> Can you see a better way ?
>>
>> Thanks.
>>
>> ______________________________________________
>> R-help@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.
>>
>
> Petr Pikal
> petr.pikal@precheza.cz
>
> ______________________________________________
> R-help@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.
>



R-help@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. Received on Fri Jan 19 01:27:42 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Thu 18 Jan 2007 - 15:30:23 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.