比较情节/领导和时间窗口中的不同时间窗口移动假期滞后

时间:2015-10-08 22:13:13

标签: r ggplot2 data.table

我想比较一个情节中不同年份的某个事件(例如“复活节”)+包括事件前后几天。到目前为止,我只能比较事件本身:

require('data.table')
require('ggplot2')
require('timeDate')

#create some sample data
a <- data.table(Date = seq(as.Date('2010-01-01'),as.Date('2012-12-31'), 'days'),
            Value = rnorm(1096))
a[as.Date(Easter(year(Date))) == Date,Easter := '1']

#create the plot
ggplot(a[!is.na(Easter),], aes(x=Easter, y=Value, group=as.factor(year(Date)), 
                              colour=as.factor(year(Date)))) + geom_point(size=5)

enter image description here

所以我到目前为止所做的是在data.table中标记Easter事件并在ggplot中使用该标记。我还考虑过标记前后的日子吗?

是否有更简单更优雅的方式来实现我的目标?

更新:我找到了一种如何为复活节创建图表的方式(仅限!)

a <- data.table(Date = seq(as.Date('2010-01-01'),as.Date('2012-12-31'), 'days'),
            Value = rnorm(1096))

a[as.Date(Easter(year(Date))) - 15 < Date & as.Date(Easter(year(Date))) + 15 > Date,
  Easter := as.integer(Date - as.Date(Easter(year(Date))))]

ggplot(a[!is.na(Easter),], aes(x=Easter, y=Value, group=as.factor(year(Date)), 
                              colour=as.factor(year(Date)))) +      
       geom_point(size=5) + geom_line()

enter image description here

我知道如何基于仅标记移动假日的列来实现相同的结果(如上面的第一个示例所示)?

1 个答案:

答案 0 :(得分:1)

#create some sample data
a <- data.table(Date = seq(as.Date('2010-01-01'),as.Date('2012-12-31'), 'days'),
            Value = rnorm(1096))

#mark the event itself
a[as.Date(Easter(year(Date))) == Date,Easter_event := 1]

#extract the indices of the event
event_list <- a[,.I[Easter_event==1]][!is.na(a[,.I[Easter_event==1]])]

#mark +-14 days around the event
for(ind in event_list){
   a[(ind - 14):(ind + 14), Easter := seq(-14,14)]
}

这样,它可以在没有“复活节”功能的情况下工作,并且可以使用未包含在timeDate包中的移动假期,如中国新年。

没有for循环可以完成整个事情吗?

  • 显然,您需要先从谷歌或其他地方获取移动假期的日期(例如中国新年)并将其放入data.table