首页 > 解决方案 > 在数据框中添加一列,其中将包括特定数量观察的频率的平均值

问题描述

我有下面的数据框,其中包含日期及其频率。我想添加第三列来估计前 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))

标签: r

解决方案


frollmeandata.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)

推荐阅读