如何在R中随时间递归计算平均值

Posted

技术标签:

【中文标题】如何在R中随时间递归计算平均值【英文标题】:How to recursively compute average over time in R 【发布时间】:2021-02-12 05:59:12 【问题描述】:

考虑以下数据集

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

假设“x”列中的 5 个观测值分别代表“周期”中的变量从 1 到 5 所假定的值。如何生成列“cum_average”??

我相信这可以使用 zoo::timeAverage 来完成,但是当我尝试在我相对较旧的机器上午餐包时,我会遇到一些冲突并且无法使用它。

任何帮助将不胜感激!

解决方案

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

成功了。

非常感谢您的回答!

【问题讨论】:

看看cumsum()函数。 相关:Rolling mean with changing window size on a large dataset 【参考方案1】:

也许你正在寻找这个。您可以首先计算 @tmfmnk 中提到的累积总和,然后除以跟踪观察次数的行号(如果需要平均值)。这里使用dplyr的代码:

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

输出:

  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

如果只需要累积和:

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

输出:

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

或者只有base R:

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

输出:

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

【讨论】:

【参考方案2】:

使用标准 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

如果您的period 向量是您希望用于计算平均值的向量,只需将1:length(value) 替换为period

【讨论】:

我建议将名称 recursive_average 更改为 cumulative_average【参考方案3】:

我们可以使用cummean

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

-输出

#   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

数据

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))

【讨论】:

以上是关于如何在R中随时间递归计算平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用递归 CTE 计算预测平均值

R语言递归函数示例(Recursive Functions):使用递归函数计算阶乘使用递归函数计算数据序列的平方和

递归计算 DataFrame 值

请问递归算法的时间复杂度如何计算呢?

如何使用递归计算幂的幂? [关闭]

如何在excel表中计算递归函数?