[R] Sliding Window in R (solved)

William Dunlap wdunlap at tibco.com
Sun Mar 4 00:16:14 CET 2012


Note that while those other routines are quick, your original code
can easily be made much faster for large n (number of rows) by
preallocating the output vectors to their ultimate length.
E.g., replace 
   out <- numeric()
   elements <- numeric()
   for (i in 1:(length(data[, 1]) - windowSize + 1)) {
by
   nOut <- length(data[, 1]) - windowSize + 1
   out <- numeric(nOut)
   elements <- numeric(nOut)
   for (i in 1:nOut) {
The former's time is quadratic in n and the latter's is linear.

(If what you asked about, running means of constant length, is your
real problem and not just a simplified version, then base::filter
can get it done quickly also.  Also, it is a waste to compute
length(i:(i+windowSize-1)) even once, not to speak of computing it for
every i) 

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Alaios
> Sent: Saturday, March 03, 2012 2:30 PM
> To: R help
> Subject: [R] Sliding Window in R (solved)
> 
> Dear all,
> you can find below my solution for sliding a window. Please find below the code for the two
> alternatives and the benchmarks.
> 
> 
> install.packages('caTools')
> require(caTools)
> do_sliding_for_a_window_duty_cycle <- function(DataToAnalyse,  windowSize) {
> 
> 
>   data<-DataToAnalyse
>   out <- numeric()
>   elements<- numeric()
>   if (length(data[,1]) >= windowSize){
>       for (i in 1:(length(data[,1]) - windowSize +1  )) {
>         out[i] <- mean(data[i:(i + windowSize - 1), ])
>         elements[i]<-length(i:(i + windowSize - 1))
>       }
>   }
> 
>   return (list(result=out , numberOfElements=elements, windowSize=windowSize ))
> }
> 
> 
> do_sliding_for_a_window_duty_cycle_alternative <- function(DataToAnalyse,
> windowSize) {
>     result= runmean(rowMeans(DataToAnalyse),windowSize,endrule="trim",alg="C")
> 
>     return( list(result= result, windowSize=windowSize))
> }
> 
> 
> 
> DataToAnalyse<-matrix(data=round(seq(1:100000000)),nrow=10000,byrow=TRUE)
> 
> 
> 
> # How much time they need to runmean
> 
> 
> system.time(a<-do_sliding_for_a_window_duty_cycle_alternative(DataToAnalyse,500))
> 
> system.time(b<-do_sliding_for_a_window_duty_cycle(DataToAnalyse,500))
> 
> 
> 
> # Are the results the same
> 
> # Print the difference of the resulted length.
> print(length(a$result)-length(b$result))
> 
> # Difference of the returned values
> boxplot(a$result-b$result)
> 
> 
> 
> 
> 
> 
> My results on a normal dual core laptop cpu
> 
> system.time(a<-do_sliding_for_a_window_duty_cycle_alternative(DataToAnalyse,500))
>    user  system elapsed
>   0.352   0.004   0.368
> 
>  system.time(b<-do_sliding_for_a_window_duty_cycle(DataToAnalyse,500))
>     user   system  elapsed
> 2834.009  207.989 3080.434
> 
> 
> > print(length(a$result)-length(b$result))
> [1] 0
> 
> 	[[alternative HTML version deleted]]



More information about the R-help mailing list