[R] How to optimize this loop ?

Petr Pikal petr.pikal at precheza.cz
Thu Jan 18 14:51:00 CET 2007


Hi

discard your loop do not optimise it.
rle is your friend

> 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 at alambic.org>
To:             	r-help at 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 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.

Petr Pikal
petr.pikal at precheza.cz



More information about the R-help mailing list