前视时间序列滤波器

时间:2014-04-02 13:13:55

标签: r time-series

我有一系列逻辑数据。我试图找到时间(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和不同的滤镜组?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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 :(得分:2)

您可以使用包lead

中的函数lagdplyr创建向量的偏移版本
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