【问题标题】:R and lubridate: create intervals in a time series using a criteriaR 和 lubridate:使用标准在时间序列中创建间隔
【发布时间】:2015-02-25 21:46:16
【问题描述】:

我无法从一些时间序列数据中创建一系列间隔。

如果我有一个包含日期、浓度以及该浓度是否超过阈值 5 的数据框 (df):

df <- structure(list(DATE = structure(c(1356183950, 1356184851, 1356185750, 
1356186650, 1356187551, 1356188450, 1356189350, 1356190250, 1356191150, 
1356192050, 1356192950, 1356193851, 1356194750, 1356195650, 1356196550, 
1356197450), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    CONC = c(3.8, 3.8, 3.7, 4.3, 5, 6, 7.2, 7, 6, 5, 4.3, 
    3.7, 3.4, 3.3, 3.1, 3), EXCEED = c(0, 0, 0, 0, 1, 1, 1, 1, 
    1, 1, 0, 0, 0, 0, 0, 0)), .Names = c("DATE", "TURBIDITY", 
"EXCEED"), row.names = 1070:1085, class = "data.frame")

我想根据低于或高于阈值的连续测量为每个时间段创建一个间隔,并返回摘要统计信息,例如:

   START                END                 MAXCONC
1  2012-12-22 13:45:50  2012-12-22 14:30:50 4.3
2  2012-12-22 14:45:51  2012-12-22 16:00:50 7.2 
3  2012-12-22 16:15:50  2012-12-22 17:30:50 4.3

我不知道如何使用 lubridate 创建不同的间隔。我应该使用另一个包吗?想法?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个可能的快速data.table 解决方案。我使用了 development version on GitHub 中的 rleid 函数,但您可以改用基本 R rle 函数

    library(data.table) # v>=1.9.5
    setDT(df)[, .(
                  START = min(DATE),   
                  END = max(DATE),
                  MAXCONC = max(TURBIDITY)
                  ),
              by = rleid(EXCEED)]
    
    ##    rleid               START                 END MAXCONC
    ## 1:     1 2012-12-22 13:45:50 2012-12-22 14:30:50     4.3
    ## 2:     2 2012-12-22 14:45:51 2012-12-22 16:00:50     7.2
    ## 3:     3 2012-12-22 16:15:50 2012-12-22 17:30:50     4.3
    

    【讨论】:

    • 谢谢!我应该能够使用 lubridate 中的 START 和 END 日期来计算我需要的其他统计信息。我还学到了一个非常有用的新术语,“运行长度编码”...... :)
    【解决方案2】:

    我只是添加了我选择的实现(即,使用 data.table::rleiddplyr 作为替代解决方案。

        library(data.table) # v >= 1.9.5
        library(dplyr)
    
        df %>%
          group_by(RUN = data.table::rleid(EXCEED)) %>%
          summarize(START = min(DATE),
                    END = max(DATE),
                    MAX = max(TURBIDITY)) %>%
          mutate(DURATION_HRS = as.numeric((END - START)/60))
    
    #  RUN               START                 END MAX DURATION_HRS
    #   1 2012-12-22 13:45:50 2012-12-22 14:30:50 4.3      0.75000
    #   2 2012-12-22 14:45:51 2012-12-22 16:00:50 7.2      1.24972
    #   3 2012-12-22 16:15:50 2012-12-22 17:30:50 4.3      1.25000
    

    【讨论】:

    • as.durationinterval 是什么?
    • lubridate::new_interval 创建一个具有指定开始和结束日期的间隔对象,lubridate::as.duration 将该对象强制转换为以秒为单位的持续时间对象。
    • 你不需要这个,只要mutate(DURATION_HRS = (END - START)/60)。每次我查看lubridate 中的函数时,似乎那里的一切都过于复杂......
    • 好电话!谢谢。我清理了代码以反映您的建议。
    猜你喜欢
    • 2017-07-03
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2021-03-23
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多