[R] Moving Average
Carl Witthoft
carl at witthoft.com
Fri Feb 27 01:51:28 CET 2009
Along similar lines, I wrote a toy script to apply any function you want
in a windowed sense. Be warned that it's about 10000 times slower
than loess().
# my own boxcar tool, just because.
# use bfunc to specify what function to apply to the windowed
# region.
# basically must be valid function name and must accept
# single value or vector of values
# "pad" generates partial-width values at ends of x so output is
# same length as input.
# and make it optional for picky people
boxcar<-function(x, width=5, bfunc='mean', pad=TRUE){
goodfunc<-try(bfunc<-get(bfunc),silent=TRUE)
if (inherits (goodfunc,"try-error")) {
stop ('"', bfunc,'"', ' is not a known function', call.=FALSE)
}
# paranoid, force width to be integer
width<-floor(width)
# fix width given definition of window() inputs
width<-max(0,(width-1))
if (width%%2 == 1) cat('Warning: window is even length, hence
asymmetric\n')
#adjust start, end points to half-window width; keep output length right
seqstart<- 1 -pad*((width+1)%/%2)
seqend<- length(x)- width + pad*(width%/%2)
boxout<-mapply(function(shiftx) {
bfunc(window(x,max(shiftx,1), min(shiftx+width,length(x)) ) )
} ,seq(seqstart, seqend) )
return(invisible(boxout))
}
More information about the R-help
mailing list