【问题标题】:Forward looking time series filter前瞻时间序列过滤器
【发布时间】:2014-05-13 19:21:37
【问题描述】:

我有一个时间序列的逻辑数据。我试图找出(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

但我不知道如何让它也向前看。也许使用边 = 2 和不同的过滤器集?任何帮助表示赞赏。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    我认为您可以通过查找具有 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
    

    【讨论】:

    • 同意。像往常一样,我遇到了逻辑问题,而不是编程问题!谢谢
    • 注意rollapplyr 行可以写成res &lt;- rollsumr(dt, 6)
    • @G.Grothendieck 谢谢。我编辑我的答案以添加您的提议。
    【解决方案2】:

    您可以使用 dplyr 包中的函数 leadlag 创建向量的偏移版本

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2010-12-27
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      相关资源
      最近更新 更多