[R] sliding window over a large vector

Veslot Jacques jacques.veslot at cemagref.fr
Tue Dec 16 13:11:37 CET 2008


Hi,

I just wrote a function quicker than slide() function with the same output, but I don't know what to do with this function! 

> sl <- function(x,z) c(0,cumsum(diff(x)[1:(length(x)-z-1)])) + rep(sum(x[1:z]),length(x)-z)

> sl(c(0,0,1,1,0,1,1,1,1,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0),3)
 [1] 1 1 2 2 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 2 2
 
> slide<-function(seq,window){
+    n<-length(seq)-window
+    tot<-c()
+    tot[1]<-sum(seq[1:window])   
+    for (i in 2:n) {
+       tot[i]<- tot[i-1]-seq[i-1]+seq[i]
+    }
+    return(tot)
+ }
  
> sl(c(0,0,1,1,0,1,1,1,1,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0),3)
 [1] 1 1 2 2 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 2 2

> slide(c(0,0,1,1,0,1,1,1,1,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0),3)
 [1] 1 1 2 2 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 2 2



> sl <- function(x,z) c(0,cumsum(diff(x)[1:(length(x)-z-1)])) +  rep(sum(x[1:z]),length(x)-z) 

> x <- rbinom(100000, 1, 0.5)

> system.time(xx1 <- slide(x,12))
utilisateur     système      écoulé 
      36.86        0.45       37.32 
> system.time(xx2 <- sl(x,12))
utilisateur     système      écoulé 
       0.01        0.00        0.02 
> all.equal(xx1,xx2)
[1] TRUE

Jacques VESLOT

CEMAGREF - UR Hydrobiologie

Route de Cézanne - CS 40061      
13182 AIX-EN-PROVENCE Cedex 5, France

Tél.   + 0033   04 42 66 99 76
fax    + 0033   04 42 66 99 34
email   jacques.veslot at cemagref.fr  


>-----Message d'origine-----
>De : markleeds at verizon.net [mailto:markleeds at verizon.net]
>Envoyé : mardi 16 décembre 2008 10:25
>À : Veslot Jacques
>Cc : Chris Oldmeadow; r-help at r-project.org
>Objet : Re: [R] sliding window over a large vector
>
>Hi: Veslot:  I'm too tired to even try to figure out why but I think
>that there is something wrong with your sl function. see below for an
>empirical
>proof of that statement.  OR maybe you're definition of sliding window
>is different than rollapply's definition but rollapply's answer makes
>more sense to me ?
>
>Output
>
>> set.seed(1)
>> x <- rbinom(24, 1, 0.5)
>> print(x)
>  [1] 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0
>>
>> xx1 <- sl(x,3)
>> print(xx1)
>  [1] 1 1 2 2 1 2 2 2 2 1 1 1 2 1 2 1 2 2 1 2 2
>>
>> temp <- zoo(x)
>> ans<-rollapply(temp,3,sum)
>> print(ans)
>  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
>  1  2  2  2  2  3  3  2  1  0  1  1  2  1  2  2  2  2  2  2  2  1
>
>
>On Tue, Dec 16, 2008 at  3:47 AM, Veslot Jacques wrote:
>
>>> sl <- function(x,z) c(0,cumsum(diff(x)[1:(length(x)-z-1)])) +
>>> rep(sum(x[1:z]),length(x)-z)
>>> x <- rbinom(100000, 1, 0.5)
>>> system.time(xx1 <- slide(x,12))
>> utilisateur     système      écoulé       36.86        0.45
>> 37.32
>>> system.time(xx2 <- sl(x,12))
>> utilisateur     système      écoulé        0.01        0.00
>> 0.02
>>> all.equal(xx1,xx2)
>> [1] TRUE
>>
>> Jacques VESLOT
>>
>> CEMAGREF - UR Hydrobiologie
>>
>> Route de Cézanne - CS 40061      13182 AIX-EN-PROVENCE Cedex 5, France
>>
>> Tél.   + 0033   04 42 66 99 76
>> fax    + 0033   04 42 66 99 34
>> email   jacques.veslot at cemagref.fr
>>
>>> -----Message d'origine-----
>>> De : r-help-bounces at r-project.org
>>> [mailto:r-help-bounces at r-project.org] De la part
>>> de Chris Oldmeadow
>>> Envoyé : mardi 16 décembre 2008 05:20
>>> À : r-help at r-project.org
>>> Objet : [R] sliding window over a large vector
>>>
>>> Hi all,
>>>
>>> I have a very large binary vector, I wish to calculate the number of
>>> 1's  over sliding windows.
>>>
>>> this is my very slow function
>>>
>>> slide<-function(seq,window){
>>>   n<-length(seq)-window
>>>   tot<-c()
>>>   tot[1]<-sum(seq[1:window])
>>>   for (i in 2:n) {
>>>      tot[i]<- tot[i-1]-seq[i-1]+seq[i]
>>>   }
>>>   return(tot)
>>> }
>>>
>>> this works well for for reasonably sized vectors. Does anybody know a
>>> way for large vectors ( length=12 million), im trying to avoid using
>>> C.
>>>
>>> Thanks,
>>> Chris
>>>
>>> ______________________________________________
>>> R-help at 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.
>>
>> ______________________________________________
>> R-help at 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.



More information about the R-help mailing list