如何在 R 中递归计算随时间变化的平均值
How to recursively compute average over time in R
考虑以下数据集
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个观测值分别代表'period'中的一个变量从1到5的取值。如何生成列 'cum_average'??
我相信这可以使用 zoo::timeAverage 来完成,但是当我尝试在我相对较旧的机器上使用午餐包时,我遇到了一些冲突并且无法使用它。
如有任何帮助,我们将不胜感激!
解决方案
new_df <- df_test %>% mutate(avgT = cumsum(value)/period)
成功了。
非常感谢您的回答!
也许您正在寻找这个。您可以先计算 @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
使用标准 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
我们可以使用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))
考虑以下数据集
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个观测值分别代表'period'中的一个变量从1到5的取值。如何生成列 'cum_average'??
我相信这可以使用 zoo::timeAverage 来完成,但是当我尝试在我相对较旧的机器上使用午餐包时,我遇到了一些冲突并且无法使用它。
如有任何帮助,我们将不胜感激!
解决方案
new_df <- df_test %>% mutate(avgT = cumsum(value)/period)
成功了。
非常感谢您的回答!
也许您正在寻找这个。您可以先计算 @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
使用标准 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
我们可以使用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))