【问题标题】:Moving average that takes into account NAs in value and gaps in available dates考虑到价值的 NA 和可用日期的差距的移动平均线
【发布时间】:2015-12-18 03:27:04
【问题描述】:

我正在处理从 2008 年到 2015 年的时间序列,但我将注意力限制在每年的 3 月到 8 月之间。更复杂的是,有些值被标记为 NA。

df 的子集(未按日期排序)如下所示:

  Date       Value   Site
1 2008-08-20     NA  Kenya
2 2008-08-29 12.954  Kenya
3 2008-08-18 29.972  Kenya
4 2008-08-16  5.080  Kenya
5 2009-04-21  3.048  Kenya
6 2009-04-22 12.954  Kenya

可能是一个不重要的细节,因为子集非常简单,但为了澄清 Site 列的目的,我会提到共有五个站点在同一跨度上具有时间序列数据。

我想添加一个列 Value10,它给出了 10 天移动平均线。我发现使用 zooTTR 等几个软件包之一可以轻松完成此操作,但我希望移动平均线对日期和站点敏感,以便它

  • 如果前 10 个值中的任何一个产生 NA,则生成当天的 NA
  • 为前 10 个值包含 Date 中的跳跃的那一天生成 NA,例如从 2008 年 8 月到 2009 年 3 月。
  • 对其作用于Site 的哪个数据很敏感

【问题讨论】:

  • 使用 split-apply-combine 函数并按 Siteyear 拆分。

标签: r date datetime time-series zoo


【解决方案1】:

问题中的数据是为刚果复制的,我们使用 2 而不是 10 的宽度,因此我们可以运行它而不会得到所有 NA 的微不足道的结果:

# data for DF

Lines <- "  Date       Value   Site
2008-08-20     NA  Kenya
2008-08-29 12.954  Kenya
2008-08-18 29.972  Kenya
2008-08-16  5.080  Kenya
2009-04-21  3.048  Kenya
2009-04-22 12.954  Kenya
2008-08-20     NA  Congo
2008-08-29 12.954  Congo
2008-08-18 29.972  Congo
2008-08-16  5.080  Congo
2009-04-21  3.048  Congo
2009-04-22 12.954  Congo"

# set up DF, convert Date column to "Date" class

DF <- read.table(text = Lines, header = TRUE)
DF$Date <- as.Date(DF$Date)

对行进行排序并使用ave按站点和年/月执行滚动平均值:

# sort rows
o <- order(DF$Site, DF$Date)
DF <- DF[o, ]

# perform rolling mean 
library(zoo)
# w <- 10
w <- 2
roll <- function(x) rollapplyr(c(rep(NA, w-1), x), w, mean)
DF$mean <- ave(DF$Value, DF$Site, as.yearmon(DF$Date), FUN = roll)

这给出了:

> DF
         Date  Value  Site   mean
10 2008-08-16  5.080 Congo     NA
9  2008-08-18 29.972 Congo 17.526
7  2008-08-20     NA Congo     NA
8  2008-08-29 12.954 Congo     NA
11 2009-04-21  3.048 Congo     NA
12 2009-04-22 12.954 Congo  8.001
4  2008-08-16  5.080 Kenya     NA
3  2008-08-18 29.972 Kenya 17.526
1  2008-08-20     NA Kenya     NA
2  2008-08-29 12.954 Kenya     NA
5  2009-04-21  3.048 Kenya     NA
6  2009-04-22 12.954 Kenya  8.001

更新重新排列演示文稿并添加更改 ave 行以使用 yearmon

【讨论】:

  • 感谢您的帮助。除了最后一行之外,这在整个数据帧上都能很好地工作,它会生成“seq.default(start.at, NROW(data), by = by) 中的错误:'by' 参数中的错误符号”
  • 问题中提供的数据不会产生错误。您所拥有的与问题中的示例数据之间一定存在一些差异。
  • 我很确定这个问题可以通过一些子集来解决。无论如何,将您的解决方案标记为正确。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多