【问题标题】:average for time period dependent on date of row取决于行日期的时间段平均值
【发布时间】:2019-01-13 19:11:45
【问题描述】:

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

这就是我的数据框现在的样子。请注意,日期中可以有重复,但 value 中的条目也会以相同的值重复(即第 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,因为 1+2+4+0+0+0+0 = 7。我如何在 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)))

平均列对我来说只是不适用。

附:为图像 cmets 道歉,我不知道。非常感谢您的帮助。

【问题讨论】:

  • 为此类任务编写的 zoo 包,特别是 zoo::rollapply
  • 过去 35 分钟一直在查看 zoo 包,无法弄清楚如何正确使用它来解决我的问题。你有什么办法可以尝试回答这个问题?我看了看,但没有找到任何与我的问题足够相似的动物园信息来帮助我。在这里挣扎:/

标签: r time-series average zoo


【解决方案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)

【讨论】:

  • 谢谢!但是,尽管我能够重现您的示例,但出于某种原因,我的真实数据的平均列只是充满了 NA。有什么想法吗?
  • 您需要提供一个可重现的示例。
  • 请勿发布代码或数据的图像。一个可重现的例子应该在文本和问题中完成,而不是在评论中,这样我们就可以复制您的文本并将其粘贴到 R 中以查看声明的结果。
  • 您真的认为让帮助您转录图像数据的人可以接受吗? 从您的控制台复制一些内容会更容易。从a handful of recommendations,我建议:dput(head(x))read.table(text=...),就像他的回答中使用的@G.Grothendieck。
  • 我很抱歉听起来很生气。就我自己而言,我经常在喝咖啡休息时间或类似的时候这样做,所以需要更多时间的事情可能会令人沮丧。 “提出好问题”并不是一项显而易见的技能,我知道我必须自己开发它。包含样本数据的最佳位置是原始问题本身:cmets 不能很好地格式化,这里没有其他合适的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2018-10-25
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多