Как перенести миллисекунды из POSIXct в другой POSIXct на основе третьего столбца в r - PullRequest
1 голос
/ 07 июля 2019

У меня около 50 уникальных событий, которые происходят более одного раза в течение дня. Решение должно пройти проверку событий, если их время начала относится к ним в столбце timestamp. Поскольку магазины timestamp, время start и end. И есть, некоторые из событий могут происходить одно за другим, имея другое время начала и другое время окончания.

Мне трудно понять следующее:

У меня есть тиббл с:
timestamp содержит точное начало и точный конец события вплоть до миллисекунд, поэтому start и stop находятся в timestamp start столбец содержит начало события без миллисекунд
stop столбец содержит конец события до миллисекунд event столбец содержит название события

Я хотел бы перенести миллисекунды с timestamp, когда началось событие, в столбец start для конкретного события, которое началось в столбце start.

   options(digits.secs=3)
   timestamp <- as.POSIXct(c("2019-01-07 06:05:23.582 CET", "2019-01-07 06:05:23.582 CET", "2019-01-07 06:05:23.582 CET",
               "2019-01-07 06:05:43.967 CET", "2019-01-07 06:05:43.967 CET", "2019-01-07 06:05:43.967 CET",
               "2019-01-07 06:05:45.026 CET","2019-01-07 06:07:10.463 CET", "2019-01-07 06:07:10.463 CET",
               "2019-01-07 06:07:18.467 CET"))

   start <- as.POSIXct(c("2019-01-07 06:05:23 CET", "2019-01-07 06:05:23 CET", "2019-01-07 06:05:23 CET", "2019-01-07 06:05:23 CET",
          "2019-01-07 06:05:23 CET", "2019-01-07 06:05:23 CET", "2019-01-07 06:05:23 CET", "2019-01-07 06:07:10 CET",
          "2019-01-07 06:07:10 CET", "2019-01-07 06:07:10 CET"))

   stop <- as.POSIXct(c(NA, NA, NA, "2019-01-07 06:05:43.967 CET", NA, "2019-01-07 06:05:43.967 CET",
         "2019-01-07 06:05:45.026 CET", NA, NA, "2019-01-07 06:07:18.467 CET"))

   event <- c("A",    "A",  "B", "A",   "B", "A",   "B", "C", "B", "B")

   df <- tibble(timestamp = timestamp, start = start, stop = stop, event = event)
   df

Конечной целью является следующая таблица:

      start                    stop                    event
      <dttm>                   <dttm>                  <chr>
    1 2019-01-07 06:05:23.582  2019-01-07 06:05:43.967  A    
    2 2019-01-07 06:05:23.582  2019-01-07 06:05:45.026  B    
    3 2019-01-07 06:07:10.463  2019-01-07 06:07:18.467  B 

Миллисекунды начала события, перенесенные из столбца timestamp в start. В моем случае событие A имеет два события с одинаковым началом и остановом до миллисекунд, поэтому требуется только одно событие.

Заранее спасибо!

1 Ответ

1 голос
/ 07 июля 2019

Я уверен, что это может улучшиться, но, похоже, делает то, что вы просили:

library(lubridate); library(dplyr)
df %>%
  # Add to the original table...
  inner_join(
    # based on a lookup table connecting the rounded starts with "real start"
    df %>% 
      mutate(real_start = if_else(timestamp %>% floor_date("seconds") == start,
                          timestamp, ymd_h(NA_real_))) %>%
      select(start, real_start) %>%
      tidyr::drop_na()
  ) %>%
  tidyr::drop_na() %>%
  distinct(event, real_start, stop)

# A tibble: 3 x 3
  event real_start              stop                   
  <chr> <dttm>                  <dttm>                 
1 A     2019-01-07 06:05:23.582 2019-01-07 06:05:43.967
2 B     2019-01-07 06:05:23.582 2019-01-07 06:05:45.026
3 B     2019-01-07 06:07:10.463 2019-01-07 06:07:18.467
...