Создайте столбец продолжительности с разницей во времени даты, сгруппированный по идентификатору - PullRequest
0 голосов
/ 09 мая 2018

У меня есть такой фрейм данных

ID <- c("111","111","112","112",
        "113","113","114","114",
        "115","116")
ACTION <- c("UA Created","UA Complete","UA Created","UA Complete",
            "UA Created","UA Expired","UA Created","UA Expired",
            "UA Created","UA Created")
Datetime <- c("2018-04-15 12:44:11","2018-04-17 12:44:11","2018-04-18 19:07:11","2018-04-19 21:11:09",
              "2018-04-23 22:24:11","2018-04-23 22:44:11","2018-04-25 17:07:11","2018-05-05 21:11:09",
              "2018-04-22 21:11:09", "2018-04-26 21:11:09")
STATUS <- c(NA,"Done",NA,"Done",
            NA,NA,NA,NA,
            NA,NA)

df <- data.frame(ID,ACTION,Datetime,STATUS) 
df$Datetime <- as.POSIXct(df$Datetime,format="%Y-%m-%d %H:%M:%S")

Я пытаюсь создать столбец с именем "DURATION_DAYS" между двумя датами, сгруппированный по идентификатору. Я хочу вернуть только строку с ACTION = 'UA Complete' или '' UA Expired 'для того же идентификатора вместе с вычисленной продолжительностью.

Мой желаемый результат -

   ID      ACTION            Datetime STATUS DURATION_DAYS
  111 UA Complete 2018-04-17 12:44:11   Done    2.00000000
  112 UA Complete 2018-04-19 21:11:09   Done    1.08608796
  113  UA Expired 2018-04-23 22:44:11     NA    0.01388889
  114  UA Expired 2018-05-05 21:11:09     NA   10.16942130
  115  UA Created 2018-04-22 21:11:09     NA            NA
  116  UA Created 2018-04-26 21:11:09     NA            NA

Я пытался использовать dplyr для этого, но почему-то не хватало логики

    library(dplyr)
    library(lubridate)
        df1 <- df %>% 
        group_by(ID) %>%
        mutate(DURATION_DAYS = as.numeric(difftime(dmy_hm(Datetime), 
                                           dmy_hm(Datetime)[1], units = 'days')))

1 Ответ

0 голосов
/ 09 мая 2018

Вы очень близки к решению. Вам не нужно использовать ymd_hm, поскольку Datetime уже имеет тип POSIXct. Кроме того, вам нужно использовать min и max, чтобы получить разницу во времени для удостоверения личности.

library(dplyr)
library(lubridate)
df %>% 
  group_by(ID) %>%
  mutate(DURATION_DAYS = (difftime(max(Datetime), 
                                  min(Datetime), units = 'days'))) %>%
  filter(ACTION %in% c("UA Complete", "UA Expired"))

# # A tibble: 4 x 5
# # Groups: ID [4]
# ID     ACTION      Datetime            STATUS DURATION_DAYS     
# <fctr> <fctr>      <dttm>              <fctr> <time>            
# 1 111    UA Complete 2018-04-17 12:44:11 Done   2                 
# 2 112    UA Complete 2018-04-19 21:11:09 Done   1.08608796296296  
# 3 113    UA Expired  2018-04-23 22:44:11 <NA>   0.0138888888888889
# 4 114    UA Expired  2018-05-05 21:11:09 <NA>   10.1694212962963  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...