我下面有日期和频率的数据框。我想添加第三列,以估计过去7天的平均值。鉴于这可以在'2020-09-18'
以后的日期以及以后的日期中起作用,因为第一个日期是7天,所以第一个日期之前'2020-09-12'
的平均值应基于存在的前几天的数量进行计算,否则应该保留2020-09-12
2020-09-17
NAs
date<-c(as.Date("2020-09-15", "%Y-%m-%d"),as.Date("2020-09-14", "%Y-%m-%d"),
as.Date("2020-09-13", "%Y-%m-%d"),as.Date("2020-09-12", "%Y-%m-%d"),
as.Date("2020-09-15", "%Y-%m-%d"),as.Date("2020-09-14", "%Y-%m-%d"),
as.Date("2020-09-13", "%Y-%m-%d"),as.Date("2020-09-12", "%Y-%m-%d"),
as.Date("2020-09-16", "%Y-%m-%d"),as.Date("2020-09-17", "%Y-%m-%d"),
as.Date("2020-09-18", "%Y-%m-%d"),as.Date("2020-09-19", "%Y-%m-%d"),
as.Date("2020-09-20", "%Y-%m-%d"),as.Date("2020-09-21", "%Y-%m-%d"),
as.Date("2020-09-22", "%Y-%m-%d"),as.Date("2020-09-23", "%Y-%m-%d"),
as.Date("2020-09-24", "%Y-%m-%d"),as.Date("2020-09-25", "%Y-%m-%d"),
as.Date("2020-09-26", "%Y-%m-%d"),as.Date("2020-09-27", "%Y-%m-%d"),
as.Date("2020-09-28", "%Y-%m-%d"),as.Date("2020-09-29", "%Y-%m-%d"),
as.Date("2020-09-30", "%Y-%m-%d"),as.Date("2020-10-01", "%Y-%m-%d"))
value<-c(5,6,7,8,-3,-5,6,8,5,6,7,8,-3,-5,6,8,5,6,7,8,-3,-5,6,8)
df<-data.frame(date,value)
df2<-data.frame(table(df$date))
frollmean
是出色data.table
封装的内存高效,快速解决方案。
library(data.table)
# define the window for each element
adaptiveparam <- c(1:6, rep(7, nrow(df)-6))
df$rollmean <- frollmean(df$value, n=adaptiveparam, adaptive = T)
> head(df,8)
date value rollmean
1 2020-09-15 5 5.000000
2 2020-09-14 6 5.500000
3 2020-09-13 7 6.000000
4 2020-09-12 8 6.500000
5 2020-09-15 -3 4.600000
6 2020-09-14 -5 3.000000
7 2020-09-13 6 3.428571
8 2020-09-12 8 3.857143
在这里,我们定义了一个adaptive
向量,用于为的每个元素指定要平均的窗口df$value
。
请注意,解析data.table
语法为:
df[,rollmean:= frollmean(value, n=c(1:6, rep(7, nrow(df)-6)), adaptive = T)]
编辑:还请注意
library(lubridate)
as_date(c("2020-09-15", "2020-09-14"))
甚至
date <- as_date("2020-09-15")+0:23
也可以很好地创建日期向量,而无需as.Date
重复使用。
EDIT2df2
只需修改如下:
adaptiveparam2 <- c(1:6, rep(7, nrow(df2)-6))
df2$rollmean <- frollmean(df2$Freq, n=adaptiveparam2, adaptive = T)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句