如何在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中随时间递归计算平均值的主要内容,如果未能解决你的问题,请参考以下文章