【问题标题】:How can I flag a regular time series with a irregular error sign in R?如何在 R 中标记具有不规则错误符号的规则时间序列?
【发布时间】:2018-03-15 21:32:49
【问题描述】:

我有一个直接的时间序列序列,例如:

library(lubridate)
start = parse_date_time("2018-01-01","%Y-%m-%d")
end = parse_date_time("2018-01-02","%Y-%m-%d")
series = seq(start,end,by=600)

> series
[1] "2018-01-01 00:00:00 UTC" "2018-01-01 00:10:00 UTC" "2018-01-01 00:20:00 UTC" "2018-01-01 00:30:00 UTC"
[5] "2018-01-01 00:40:00 UTC" "2018-01-01 00:50:00 UTC" "2018-01-01 01:00:00 UTC" "2018-01-01 01:10:00 UTC"
[9] "2018-01-01 01:20:00 UTC" "2018-01-01 01:30:00 UTC" "2018-01-01 01:40:00 UTC" "2018-01-01 01:50:00 UTC"
[13] "2018-01-01 02:00:00 UTC" "2018-01-01 02:10:00 UTC" "2018-01-01 02:20:00 UTC" "2018-01-01 02:30:00 UTC"...

而且我还有一个不规则状态的向量,例如:

error = data.frame(
on = parse_date_time(c("2018-01-01 00:13:57","2018-01-01 01:01:44"),"%Y-%m-%d %H:%M:%S"),
off = parse_date_time(c("2018-01-01 00:21:32","2018-01-01 02:33:45"),"%Y-%m-%d %H:%M:%S")
)

> error
                   on                 off
1 2018-01-01 00:13:57 2018-01-01 00:21:32
2 2018-01-01 01:01:44 2018-01-01 02:33:45

我怎样才能像下面这样用错误标记我的系列?

> flag 
                         series        error
  [1] "2018-01-01 00:00:00 UTC"         "OK"
  [2] "2018-01-01 00:10:00 UTC"         "OK"
  [3] "2018-01-01 00:20:00 UTC"      "ERROR"
  [4] "2018-01-01 00:30:00 UTC"      "ERROR"
  [5] "2018-01-01 00:40:00 UTC"         "OK"
  [6] "2018-01-01 00:50:00 UTC"         "OK"
  [7] "2018-01-01 01:00:00 UTC"         "OK"
  [8] "2018-01-01 01:10:00 UTC"      "ERROR"
  [9] "2018-01-01 01:20:00 UTC"      "ERROR"
 [10] "2018-01-01 01:30:00 UTC"      "ERROR"
 [11] "2018-01-01 01:40:00 UTC"      "ERROR"
 [12] "2018-01-01 01:50:00 UTC"      "ERROR"
 [13] "2018-01-01 02:00:00 UTC"      "ERROR"
 [14] "2018-01-01 02:10:00 UTC"      "ERROR"
 [15] "2018-01-01 02:20:00 UTC"      "ERROR"
 [16] "2018-01-01 02:30:00 UTC"      "ERROR"
 [17] "2018-01-01 02:40:00 UTC"      "ERROR"
 [18] "2018-01-01 02:50:00 UTC"         "OK"

【问题讨论】:

    标签: r timestamp time-series


    【解决方案1】:

    这是一个使用map_lgl 的解决方案,因为lubridate 间隔对我来说很有趣dplyr 函数。请注意,我在off 上使用ceiling_date 来重现您想要的输出,尽管我不清楚为什么最后一行算作ERROR,因为例如,输出"2018-01-01 00:30:00 UTC" 中的第4 行在第一行之后off 价值 "2018-01-01 00:21:32"。关键部分只是使用interval(或者on %--% off)创建间隔,然后使用any(%within%) 返回一个逻辑值,以确定系列中的给定值是否在错误间隔之一内。 ifelse 让我们将值转换为字符标志。

    library(tidyverse)
    library(lubridate)
    #> 
    #> Attaching package: 'lubridate'
    #> The following object is masked from 'package:base':
    #> 
    #>     date
    start = parse_date_time("2018-01-01","%Y-%m-%d")
    end = parse_date_time("2018-01-02","%Y-%m-%d")
    series = seq(start,end,by=600)
    error = data.frame(
      on = parse_date_time(c("2018-01-01 00:13:57","2018-01-01 01:01:44"),"%Y-%m-%d %H:%M:%S"),
      off = parse_date_time(c("2018-01-01 00:21:32","2018-01-01 02:33:45"),"%Y-%m-%d %H:%M:%S")
    ) %>%
      mutate(
        off = ceiling_date(off, unit = "10 minutes"),
        intvs = interval(on, off)
      )
    
    series %>%
      tibble(dttm = .) %>%
      bind_cols(status = map_lgl(series, ~ any(. %within% error$intvs))) %>%
      mutate(status = ifelse(status == TRUE, "ERROR", "OK")) %>%
      print(n = 20)
    #> # A tibble: 145 x 2
    #>    dttm                status
    #>    <dttm>              <chr> 
    #>  1 2018-01-01 00:00:00 OK    
    #>  2 2018-01-01 00:10:00 OK    
    #>  3 2018-01-01 00:20:00 ERROR 
    #>  4 2018-01-01 00:30:00 ERROR 
    #>  5 2018-01-01 00:40:00 OK    
    #>  6 2018-01-01 00:50:00 OK    
    #>  7 2018-01-01 01:00:00 OK    
    #>  8 2018-01-01 01:10:00 ERROR 
    #>  9 2018-01-01 01:20:00 ERROR 
    #> 10 2018-01-01 01:30:00 ERROR 
    #> 11 2018-01-01 01:40:00 ERROR 
    #> 12 2018-01-01 01:50:00 ERROR 
    #> 13 2018-01-01 02:00:00 ERROR 
    #> 14 2018-01-01 02:10:00 ERROR 
    #> 15 2018-01-01 02:20:00 ERROR 
    #> 16 2018-01-01 02:30:00 ERROR 
    #> 17 2018-01-01 02:40:00 ERROR 
    #> 18 2018-01-01 02:50:00 OK    
    #> 19 2018-01-01 03:00:00 OK    
    #> 20 2018-01-01 03:10:00 OK    
    #> # ... with 125 more rows
    

    由reprex package (v0.2.0) 于 2018 年 3 月 15 日创建。

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 2011-11-17
      • 1970-01-01
      • 2012-09-19
      • 2016-04-07
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多