移动平均线,考虑到NAs的价值和可用日期的差距

时间:2015-09-21 12:18:58

标签: r date datetime time-series zoo

我正在处理从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的数据敏感

1 个答案:

答案 0 :(得分:3)

问题中的数据被复制为刚果,我们使用的宽度为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