-----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
[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