set.seed(42)
marketdata <- data.frame(mid=runif(200, 245, 255),
bo=runif(200, 0, 0.2))
movingWindow <- function (submarketdata) {
temp <- submarketdata[submarketdata$bo <= 0.1, ]
return( c(mean(temp$mid), NROW(temp)/100) )
}
result <- t(sapply(c(101:NROW(marketdata)), function(i) movingWindow( marketdata[ (i-99):i , ] )))
#faster alternative:
library(zoo)
r1 <- rollmean(marketdata$bo <= 0.1, 100)
all.equal(r1[-1], result[,2])
r2 <- rollsum((marketdata$bo <= 0.1)*marketdata$mid, 100)/(100*r1)
result2 <- cbind(r2, r1)
#same result?
all.equal(result, unname(result2[-1,]))
#[1] TRUE
#base R alternative (assuming there are no NA values in your data)
r1a <- na.omit(filter(marketdata$bo <= 0.1, rep(0.01, 100)))
r2a <- na.omit(filter((marketdata$bo <= 0.1)*marketdata$mid, rep(1, 100)))/(100*r1a)
result2a <- cbind(r2a, r1a)
#same result?
all.equal(result, unname(result2a[-1,]))
#[1] TRUE
The alternatives give one value more (the first value). Otherwise the results are identical and both alternatives are much faster.
Benchmarks for the example:
Unit: microseconds
expr min lq median uq max neval
original 19006.144 19435.262 20824.245 21243.524 52965.168 100
alternative1 1444.574 1525.774 1607.264 1646.524 3486.940 100
alternative2 975.366 1006.913 1071.305 1106.437 3117.709 100