按时间段滚动平均而不是 R 中的观察
Rolling average by time period rather than observation in R
我有一个日期随机出现的数据集。例如:
10/21/15、11/21/15、11/22/15、11/28/15、11/30/15、12/12/15...等等
我希望按时间段而不是观察级别创建滚动平均值。例如,如果我想计算过去 7 天的移动平均线。我不想查看最后 7 行,而是最近 7 天
举个小例子:
dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
value = c(5,10,5,3,2)
df=data.frame(dates, value)
df$desired = c(NA,5,7.5, NA,NA)
我显然希望对更大的数据集执行此操作,但我希望你能理解。例如,如果我使用 7 天,这就是我期望的结果。
请注意,我没有将当前观测值包括在滚动平均值中,只包括之前的观测值。我想要按时间段滚动平均,而不是观察行号。
我试着查看 rollmean 和 dplyr,但我无法弄明白。不过我真的不在乎它是怎么发生的。
谢谢!
试试这个:
rollavgbyperiod <- function(i,window){
startdate <- dates[i]-window
enddate <- dates[i]-1
interval <- seq(startdate,enddate,1)
tmp <- value[dates %in% interval]
return(mean(tmp))
}
dates <- as.Date(dates)
window <- 7
res <- sapply(1:length(dates),function(m) rollavgbyperiod(m,window))
res[is.nan(res)] <- NA
> data.frame(dates,value,res)
dates value res
1 2015-08-07 5 NA
2 2015-08-08 10 5.0
3 2015-08-09 5 7.5
4 2015-09-09 3 NA
5 2015-10-10 2 NA
我建议在这种情况下使用 runner 包。这里需要的是 mean_run
和 k = 7
window,滞后 1 个句点。简单的一行:
library(runner)
dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
value = c(5, 10, 5, 3, 2)
mean_run(x = value, k = 7, lag = 1, idx = as.Date(dates))
#[1] NA 5.0 7.5 NA NA
我有一个日期随机出现的数据集。例如:
10/21/15、11/21/15、11/22/15、11/28/15、11/30/15、12/12/15...等等
我希望按时间段而不是观察级别创建滚动平均值。例如,如果我想计算过去 7 天的移动平均线。我不想查看最后 7 行,而是最近 7 天
举个小例子:
dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
value = c(5,10,5,3,2)
df=data.frame(dates, value)
df$desired = c(NA,5,7.5, NA,NA)
我显然希望对更大的数据集执行此操作,但我希望你能理解。例如,如果我使用 7 天,这就是我期望的结果。
请注意,我没有将当前观测值包括在滚动平均值中,只包括之前的观测值。我想要按时间段滚动平均,而不是观察行号。
我试着查看 rollmean 和 dplyr,但我无法弄明白。不过我真的不在乎它是怎么发生的。
谢谢!
试试这个:
rollavgbyperiod <- function(i,window){
startdate <- dates[i]-window
enddate <- dates[i]-1
interval <- seq(startdate,enddate,1)
tmp <- value[dates %in% interval]
return(mean(tmp))
}
dates <- as.Date(dates)
window <- 7
res <- sapply(1:length(dates),function(m) rollavgbyperiod(m,window))
res[is.nan(res)] <- NA
> data.frame(dates,value,res)
dates value res
1 2015-08-07 5 NA
2 2015-08-08 10 5.0
3 2015-08-09 5 7.5
4 2015-09-09 3 NA
5 2015-10-10 2 NA
我建议在这种情况下使用 runner 包。这里需要的是 mean_run
和 k = 7
window,滞后 1 个句点。简单的一行:
library(runner)
dates = c('2015-08-07', '2015-08-08','2015-08-09','2015-09-09','2015-10-10')
value = c(5, 10, 5, 3, 2)
mean_run(x = value, k = 7, lag = 1, idx = as.Date(dates))
#[1] NA 5.0 7.5 NA NA