Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R和lubridate:使用标准在时间序列中创建间隔_R - Fatal编程技术网

R和lubridate:使用标准在时间序列中创建间隔

R和lubridate:使用标准在时间序列中创建间隔,r,R,我很难从一些时间序列数据中创建一系列的时间间隔 如果我有一个数据框(df),其中包含日期、浓度以及浓度是否超过阈值5: df <- structure(list(DATE = structure(c(1356183950, 1356184851, 1356185750, 1356186650, 1356187551, 1356188450, 1356189350, 1356190250, 1356191150, 1356192050, 1356192950, 1356193851, 1

我很难从一些时间序列数据中创建一系列的时间间隔

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

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")

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

这里有一个快速可行的
数据表
解决方案。我使用了中的
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

我只是添加了我确定的实现(即,使用
data.table::rleid
dplyr
作为替代解决方案)

    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

谢谢!我应该能够使用lubridate中的开始和结束日期来计算所需的其他统计数据。我还学习了一个非常有用的新术语,“运行长度编码”…)什么是
as.duration
interval
lubridate::new_interval
创建一个具有指定开始和结束日期的interval对象,并且
lubridate::as.duration
在几秒钟内将该对象强制为duration对象。您不需要这个,只需执行
mutate(duration\u HRS=(end-start)/60)
。每次我查看lubridate中的函数时,似乎那里的一切都太复杂了……打得好!谢谢我整理了代码以反映您的建议。
    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