another_newbie
another_newbie

Reputation: 139

How to recursively compute average over time in R

Consider the follow dataset

period<-c(1,2,3,4,5)
x<-c(3,6,7,4,6)
cumulative_average<-c((3)/1,(3+6)/2,(3+6+7)/3,(3+6+7+4)/4,(3+6+7+4+6)/5)

df_test<-data.frame(value,cum_average)

df_test

period   value  cum_average
  1        3        3
  2        6        4.5
  3        7        5.3         
  4        4        5.0
  5        6        5.2

Assume that the 5 observations in the 'x' column represents the value assumed by a variable in 'period' from 1 to 5, respectively. How can I produce column 'cum_average'??

I believe that this could be done using zoo::timeAverage but when I try to lunch the package on my relatively old machine I incur in some conflict and cannot use it.

Any help would be much appreciated!

Solution

new_df <- df_test %>% mutate(avgT = cumsum(value)/period)

did the trick.

Thank you so much for your answers!

Upvotes: 0

Views: 102

Answers (3)

akrun
akrun

Reputation: 887213

We can use cummean

library(dplyr)
df_test %>%
       mutate(AvgTime=cummean(value))

-output

#   period value  AvgTime
#1      1     3 3.000000
#2      2     6 4.500000
#3      3     7 5.333333
#4      4     4 5.000000
#5      5     6 5.200000

data

df_test <- structure(list(period = c(1, 2, 3, 4, 5), value = c(3, 6, 7, 
4, 6)), class = "data.frame", row.names = c(NA, -5L))

Upvotes: 0

Qwethm
Qwethm

Reputation: 394

Using standard R:

period<-c(1,2,3,4,5)
value<-c(3,6,7,4,6)
recursive_average<-cumsum(value) / (1:length(value))

df_test<-data.frame(value, recursive_average)

df_test

    value recursive_average
1     3          3.000000
2     6          4.500000
3     7          5.333333
4     4          5.000000
5     6          5.200000

If your period vector, is the vector you wish to use to calculate the average, simply replace 1:length(value) with period

Upvotes: 1

Duck
Duck

Reputation: 39605

Maybe you are looking for this. You can first compute the cumulative sum as mentioned by @tmfmnk and then divide by the rownumber which tracks the number of observation, if the mean is required. Here the code using dplyr:

library(dplyr)
#Code
newdf <- df_test %>% mutate(AvgTime=cumsum(x)/row_number())

Output:

  period x  AvgTime
1      1 3 3.000000
2      2 6 4.500000
3      3 7 5.333333
4      4 4 5.000000
5      5 6 5.200000

If only cumulative sum is needed:

#Code2
newdf <- df_test %>% mutate(CumTime=cumsum(x))

Output:

  period x CumTime
1      1 3       3
2      2 6       9
3      3 7      16
4      4 4      20
5      5 6      26

Or only base R:

#Base R
df_test$Cumsum <- cumsum(df_test$x)

Output:

  period x Cumsum
1      1 3      3
2      2 6      9
3      3 7     16
4      4 4     20
5      5 6     26

Upvotes: 1

Related Questions