移动平均函数问题
Moving Average Function Issue
我有两个向量。每天想加一行,让数据集变大一行:
day1 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4)
day2 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4,0)
我有两个函数,分别用作累积平均值和滚动平均值。两者都给出了滞后 1 的平均值。
cumroll <- function(x) {
if(length(x)<=1) {x}
else {
x <- head(x, -1)
c(head(x,1), cumsum(x) / seq_along(x))
}
}
rollmean <- function(x, n) {if (length(x) <= n) cumroll(x) else rollapply(x,list(-seq(n)), mean, fill = cumroll(x))}
我希望使用以下代码对两个数据集进行 20 的滚动平均值:
day1_avg <- ave(day1, FUN = function(x) rollmean(x, 20))
day2_avg <- ave(day2, FUN = function(x) rollmean(x, 20))
当我 运行 day1_avg 时,它的行为与我预期的一样,因为只有 20 个观测值,所以 cumroll 起作用。但是,当我 运行 day2_avg 进行 21 次观察时,第 21 次观察之前的每个值都会自动给出 0 而不是 cumroll 值。
下面是我想要的 day2_avg 输出结果:
day2 day1_avg day2_avg DESIRED
0 0 0 0
0 0 0 0
8 0 0 0
10 2.666667 0 2.666667
4 4.5 0 4.5
5 4.4 0 4.4
3 4.5 0 4.5
5 4.285714 0 4.285714
6 4.375 0 4.375
10 4.555556 0 4.555556
7 5.1 0 5.1
11 5.272727 0 5.272727
9 5.75 0 5.75
7 6 0 6
10 6.071429 0 6.071429
13 6.333333 0 6.333333
8 6.75 0 6.75
7 6.823529 0 6.823529
5 6.833333 0 6.833333
4 6.736842 0 6.736842
0 6.6 6.6
我需要以某种方式修改函数,以确保在第 n 次观察 rollmean 开始后 cumroll 值保持不变。
如有任何帮助,我们将不胜感激!
改变你的rollmean
:
rollmean <- function(x, n) {if (length(x) <= n) tmp<- cumroll(x)
else {tmp<-rollapply(x,list(-seq(n)), mean, fill = cumroll(x))
tmp[1:n]<-cumroll(x[1:n])
}
tmp}
您将获得:
> tail(cbind(day1,day1_avg,day2,day2_avg))
day1 day1_avg day2 day2_avg
[17,] 8 6.750000 8 6.750000
[18,] 7 6.823529 7 6.823529
[19,] 5 6.833333 5 6.833333
[20,] 4 6.736842 4 6.736842
[21,] 0 0.000000 0 6.600000
[22,] 0 0.000000 1 6.600000
我有两个向量。每天想加一行,让数据集变大一行:
day1 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4)
day2 <- c(0,0,8,10,4,5,3,5,6,10,7,11,9,7,10,13,8,7,5,4,0)
我有两个函数,分别用作累积平均值和滚动平均值。两者都给出了滞后 1 的平均值。
cumroll <- function(x) {
if(length(x)<=1) {x}
else {
x <- head(x, -1)
c(head(x,1), cumsum(x) / seq_along(x))
}
}
rollmean <- function(x, n) {if (length(x) <= n) cumroll(x) else rollapply(x,list(-seq(n)), mean, fill = cumroll(x))}
我希望使用以下代码对两个数据集进行 20 的滚动平均值:
day1_avg <- ave(day1, FUN = function(x) rollmean(x, 20))
day2_avg <- ave(day2, FUN = function(x) rollmean(x, 20))
当我 运行 day1_avg 时,它的行为与我预期的一样,因为只有 20 个观测值,所以 cumroll 起作用。但是,当我 运行 day2_avg 进行 21 次观察时,第 21 次观察之前的每个值都会自动给出 0 而不是 cumroll 值。
下面是我想要的 day2_avg 输出结果:
day2 day1_avg day2_avg DESIRED
0 0 0 0
0 0 0 0
8 0 0 0
10 2.666667 0 2.666667
4 4.5 0 4.5
5 4.4 0 4.4
3 4.5 0 4.5
5 4.285714 0 4.285714
6 4.375 0 4.375
10 4.555556 0 4.555556
7 5.1 0 5.1
11 5.272727 0 5.272727
9 5.75 0 5.75
7 6 0 6
10 6.071429 0 6.071429
13 6.333333 0 6.333333
8 6.75 0 6.75
7 6.823529 0 6.823529
5 6.833333 0 6.833333
4 6.736842 0 6.736842
0 6.6 6.6
我需要以某种方式修改函数,以确保在第 n 次观察 rollmean 开始后 cumroll 值保持不变。
如有任何帮助,我们将不胜感激!
改变你的rollmean
:
rollmean <- function(x, n) {if (length(x) <= n) tmp<- cumroll(x)
else {tmp<-rollapply(x,list(-seq(n)), mean, fill = cumroll(x))
tmp[1:n]<-cumroll(x[1:n])
}
tmp}
您将获得:
> tail(cbind(day1,day1_avg,day2,day2_avg))
day1 day1_avg day2 day2_avg
[17,] 8 6.750000 8 6.750000
[18,] 7 6.823529 7 6.823529
[19,] 5 6.833333 5 6.833333
[20,] 4 6.736842 4 6.736842
[21,] 0 0.000000 0 6.600000
[22,] 0 0.000000 1 6.600000