我想比较一个情节中不同年份的某个事件(例如“复活节”)+包括事件前后几天。到目前为止,我只能比较事件本身:
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)
所以我到目前为止所做的是在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()
我知道如何基于仅标记移动假日的列来实现相同的结果(如上面的第一个示例所示)?
答案 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循环可以完成整个事情吗?