I would like to know how to calculate the cumulative average for some numbers. I will give a simple example to describe what I am looking for.
I have the following numbers
vec <- c(1, 2, 3, 4, 5)
If I do the average of these numbers I will get 3 as a result.
Now, how to do the cumulative average of these numbers.
The question indicates serious lack of research but I don't have enough reputation yet to vote the question down. If I understand the question correctly, what is desired is the cumulative moving average.
Wikipedia describes cumulative moving average very clearly. I'm not allowed to post an image here but follow that link for a simple formula (a weighted average of the previous average and the new value).
In analogy to the cumulative sum of a list I propose this: The cumulative average avg of a vector x would contain the averages from 1st position till position i.
One method is just to compute the the mean for each position by summing over all previous values and dividing by their number.
By rewriting the definition of the arithmetic mean as a recursive formula. One gets
avg(1) = x(1)
and
avg(i) = (i-1)/i*avg(i-1) + x(i)/i; (i > 1)
Evaluating this expression for every element of your vector (or list, one-dimensional array or however you call it) gives you the cumulative average.
This recursive method comes in handy if you have to calculate an average over very large or very many integers and would run into an overflow if you had to store their cumulative sum.
In your example
1, 2, 3, 4, 5
we get
1, 1.5, 2, 2.5, 3
This is an old question and there have been lot of changes since then. I just thought of updating it with a dplyr
answer. dplyr
has a cummean
function which directly gives the cumulative mean of the vector.
vec <- c(1, 2, 3, 4, 5)
library(dplyr)
cummean(vec)
#[1] 1.0 1.5 2.0 2.5 3.0
You can use the cumsum()
function and the seq_along()
function so read up on those. But the code provided make it clear. 6, 6 + 16, 6 + 16 + 8, and so on.
x <- sample(1:20)
x
# [1] 6 16 8 1 17 11 2 19 18 5 15 13 3 20 9 14 7 10 12 4
cumsum(x) / seq_along(x)
# [1] 6.000000 11.000000 10.000000 7.750000 9.600000 9.833333 8.714286
#10.000000 10.888889 10.300000
#[11] 10.727273 10.916667 10.307692 11.000000 10.866667 11.062500 10.823529
#10.777778 10.842105 10.500000
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With