时间段的平均值取决于行的日期

时间:2018-08-06 19:09:48

标签: r time-series average zoo

我有一个日期列表,每个日期都有一个值。

这是我的数据框现在的样子。请注意,日期中可以有重复项,但值的输入也将以相同的值重复(即第2行和第3行具有相同的日期,但各自的值也相同)。

  date         value
1 2018-02-08   1
2 2018-02-09   2
3 2018-02-09   2
4 2018-02-10   4
  ...          ...

这就是我想要数据框的样子

     date         value  weekavg
   1 2018-02-08    1     ...
   2 2018-02-09    2     ...
   3 2018-02-09    2     ...
   4 2018-02-10    4     ...
   5 2018-02-11    0     ...
   6 2018-02-12    0     ...
   7 2018-02-13    0     ...
   8 2018-02-14    0     ...
   9 2018-02-15    0     1
     ...           ...   ...

为澄清起见,第九行中的条目是通过查找一周前发生的日期来计算的,因此对于2018-02-15而言,其日期范围为2018-02-08至2018-02-13 。因此,由于1 + 2 + 4 + 0 + 0 + 0 + 0 = 7,结果为1。我该如何在R中执行此操作,然后对每一行执行此操作?

------可复制示例-----

数据

lines <-    "date      value
        1   2018-02-08    NA
        2   2018-02-08    NA
        3   2018-02-09    NA
        4   2018-02-10   295
        5   2018-02-10   295
        6   2018-02-11   329
        7   2018-02-12   242
        8   2018-02-12   242
        9   2018-02-13   317
        10  2018-02-14   341
        11  2018-02-15   292
        12  2018-02-16   363
        13  2018-02-17   380
        14  2018-02-18   319
        15  2018-02-19   307
        16  2018-02-20   328
        17  2018-02-21   290"

df <- read.table(text = lines)
newDF <- merge(df, transform(unique(df), mean = rollmeanr(value, 7, fill = NA)))

平均值列对我而言只是NA。

P.S。对于图片评论的道歉,我不知道。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

该问题并未完全定义输出,而是假设:

  • 没有丢失的日子,只有重复的日子
  • 如果重复一天,则该行的平均值应该重复

然后:

library(zoo)

merge(DF, transform(unique(DF), mean = rollmeanr(value, 7, fill = NA)))

对于注释末尾可重复显示的示例数据,给出:

        date value      mean
1 2018-02-08     1        NA
2 2018-02-09     2        NA
3 2018-02-09     2        NA
4 2018-02-10     4        NA
5 2018-02-11     0        NA
6 2018-02-12     0        NA
7 2018-02-13     0        NA
8 2018-02-14     0 1.0000000
9 2018-02-15     0 0.8571429

注意

Lines <- "
     date         value 
   1 2018-02-08    1 
   2 2018-02-09    2  
   3 2018-02-09    2 
   4 2018-02-10    4    
   5 2018-02-11    0 
   6 2018-02-12    0 
   7 2018-02-13    0 
   8 2018-02-14    0    
   9 2018-02-15    0
"
DF <- read.table(text = Lines)