Skip to content
Back to formatted view

Raw Message

Message-ID: <CA63A97A-777E-40AA-8DC1-A0972AA15A5D@comcast.net>
Date: 2014-02-17T19:27:00Z
From: David Winsemius
Subject: How to calculate moving average without using filter()?
In-Reply-To: <CAE2FW2kVwgDjKq9r9v38Q5MRZto8kt2Z4Ah1qtzLGNV=iB-oXg@mail.gmail.com>

On Feb 17, 2014, at 10:45 AM, C W wrote:

> Hi list,
> How do I calculate a moving average without using filter().  filter() does
> not seem to give weighted averages.
> 
> I am looking into apply(), tapply,... But nothing "moves".
> 
> For example,
> 
> dat<-c(1:20)
> mean(dat[1:3])
> mean(dat[4:6])
> mean(dat[7:9])
> mean(dat[10:12])
> 
> etc...
> 
> I understand the point of apply is to avoid loops, how should I incorporate
> this idea into using an apply()?
> 

Construct a vector for grouping and use tapply. Modulo division is a common method for achieving this. Sometimes the seq-function can be used if you adjust the length properly.

> tapply(dat, (0:(length(dat)-1))%/%3, mean)
   0    1    2    3    4    5    6 
 2.0  5.0  8.0 11.0 14.0 17.0 19.5 


tapply(dat, round(seq(1, (length(dat)/3),  len=length(dat))), mean)
   1    2    3    4    5    6    7 
 1.5  4.5  8.0 11.0 14.5 18.0 20.0 

The comment about weighting dos not seem to be exemplified in your example.

> Thanks,
> Mike
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> 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.

David Winsemius
Alameda, CA, USA