[R] running mean in blocks
David Winsemius
dwinsemius at comcast.net
Mon Jul 11 16:23:30 CEST 2011
On Jul 11, 2011, at 9:23 AM, Joshua Wiley wrote:
> Hi,
>
> Take a look at package "zoo", perhaps something like:
>
> require(zoo)
> x <- rnorm(10000) # hypothetical data
> m <- rollapply(zoo(x), width = 100, FUN = mean, by = 100)
>
Definitely a better answer, but if all your rolling averages were of
the form you suggested, then rollapply might be overkill, since tapply
could easily do it:
tapply(x, rep(1:100, each=100), mean)
If you were always using non-overlapping blocks, then something like
tapply(x, rep(1:( length(x)/wid ) , each= wid) , mean)
Which will throw an error if length is not an integer multiple of "wid"
> Another (bit more of a hack) option would be:
>
> ## convert vector to matrix byrows with 100 columns per row
> ## (where 100 is the number of points you want at a time)
> ## use rowMeans function to get mean of each row quickly
> m2 <- rowMeans(matrix(x, ncol = 100, byrow = TRUE))
>
>
> ?rollapply # from package zoo
> ?rowMeans # in base
For Joshua's colMeans(matrix(..)) approach you need to be careful "at
the end" because of recycling or at least heed warnings. I suspect
that rollapply has protections built-in to avoid spurious recycling.
> matrix(c(1,2,3), 2, byrow=TRUE)
[,1] [,2]
[1,] 1 2
[2,] 3 1
--
David.
>
> HTH,
>
> Josh
>
> On Mon, Jul 11, 2011 at 2:23 AM, M. B <workstuffr at googlemail.com>
> wrote:
>> Hello,
>> I am running R on Linux and have a column of data 10000 points
>> long. I would
>> like to take a moving average of say 100 points at a time, so I end
>> up with
>> one column of 100 points. What is the simplest way of doing this?
>> I would
>> like to be able to adjust the width of the averaging blocks.
>>
>> Thanks much!
>>
>> [[alternative HTML version deleted]]
>
David Winsemius, MD
West Hartford, CT
More information about the R-help
mailing list