2014-04-02 36 views
3

我有一个时间序列的逻辑数据。我试图找到时间:(a)当时的逻辑是错误的; (b)前三个时期的逻辑是错误的; (c)以下两个时期的逻辑是错误的。例如在以下数据框中,只有时间5符合标准。前瞻性时间序列滤波器

example <- structure(list(time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), raining = c(TRUE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE)), .Names = c("time", 
"raining"), row.names = c(NA, -10L), class = "data.frame") 

我可以很容易地查看当前的时间和前三款使用过滤器

example$filtered <- filter(example[,"raining"], c(1,1,1,1), sides = 1) == 0 

,但我无法弄清楚如何让它也期待着。也许使用sides = 2和一个不同的过滤器集合?任何帮助表示赞赏。

回答

3

我想你可以通过寻找具有6个前一分等于0点重新制定问题再取2了你的矢量版本从索引获得理想的结果。

000 0 00 <---> 00000 0 
    --- _ ++  ----- _ 

这里使用zoo包解决方案:

library(zoo) 
dt = zoo(example$raining,order.by=example$time) 
res <- rollsumr(dt, 6) ## as commented below 
index(res[res==0])-2 
[1] 5 

使用filter,你可以这样做:

filter(example[,"raining"], rep(1,6), sides = 1)==0 
+1

+1更简单的方式来看待这个问题! – Henrik

+0

同意。像往常一样,我有一个逻辑问题,而不是编程问题!谢谢 –

+0

请注意,'rollapplyr'行可写为'res < - rollersumr(dt,6)'。 –

2

您可以创建偏移使用功能leadlag封装dplyr

library(dplyr) 
m <- cbind(sapply(3:1, function(x) lag(rain, x)), # preceeding three 
      rain,         # current 
      sapply(1:2, function(x) lead(rain, x))) # following two 

# find row with all FALSE 
which(rowSums(m, na.rm = TRUE) == 0) 
# [1] 5