Сводный фрейм данных R-Studio для получения даты начала и окончания для идентификатора и статуса - PullRequest
0 голосов
/ 29 января 2020

У меня есть df, и я хочу повернуть его, чтобы получить время начала и окончания для каждого идентификатора и для элементов статуса 14.

Звучит как вызов, и я пытался решить его с нулевой удачей.

Итак, мой фрейм данных выглядит так:

id  changes_dttm        old_status_cd   new_status_cd
1   29/01/2020 08:45    13              14
2   29/01/2020 09:39    13              14
2   29/01/2020 06:24    14              13
2   28/01/2020 20:11    13              14
2   26/01/2020 17:34    14              13
2   26/01/2020 16:12    13              14
2   26/01/2020 09:42    12              13
3   26/01/2020 13:58    13              14
3   26/01/2020 09:47    14              13
3   25/01/2020 13:43    -3              14
3   25/01/2020 06:01    12              -3
4   23/01/2020 05:54    -2              20
4   22/01/2020 10:24    14              -2
4   21/01/2020 11:44    13              14

Желаемые результаты :

id  changes_dttm        old_status_cd   new_status_cd       14 Start            14 end
1   29/01/2020 08:45    13              14                  29/01/2020 08:45    
2   29/01/2020 09:39    13              14                  29/01/2020 09:39    
2   28/01/2020 20:11    13              14                  28/01/2020 20:11    29/01/2020 06:24
2   26/01/2020 16:12    13              14                  26/01/2020 16:12    26/01/2020 17:34
3   26/01/2020 13:58    13              14                  26/01/2020 13:58    
3   25/01/2020 13:43    -3              14                  25/01/2020 13:43    26/01/2020 09:47
4   21/01/2020 11:44    13              14                  21/01/2020 11:44    22/01/2020 10:24

Пустое значение - это когда дата и время окончания указаны для идентификатора, поэтому это правильно:)

Мой код для получения значения выше подмножества:

library(data.table)
library(lubridate)

    id <- c(1,2,2,2,2,2,2,3,3,3,3,4,4,4)
    changes_dttm <- c("29/01/2020 08:45","29/01/2020 09:39", "29/01/2020 06:24","28/01/2020 20:11","26/01/2020 17:34","26/01/2020 16:12","26/01/2020 09:42","26/01/2020 13:58","26/01/2020 09:47","25/01/2020 13:43","25/01/2020 06:01","23/01/2020 05:54","22/01/2020 10:24","21/01/2020 11:44")
    old_status_cd <- c(13,13,14,13,14,13,12,13,14,-3,12,-2,14,13)
    new_status_cd <- c(14,14,13,14,13,14,13,14,13,14,-3,20,-2,14)

    df <- data.frame(id,as.POSIXct(df$changes_dttm, format="%d/%m/%Y %H:%M") , old_status_cd, new_status_cd)
    colnames(df)[2] <- "changes_dttm"

1 Ответ

2 голосов
/ 06 февраля 2020

Решение dplyr:

library(dplyr)
library(lubridate)

df %>%
    arrange(id, changes_dttm) %>%
    group_by(id) %>%
    mutate(Start = changes_dttm
           , End = lead(changes_dttm)) %>%
    filter(new_status_cd == 14) %>%
    arrange(id, desc(changes_dttm))

     id changes_dttm        old_status_cd new_status_cd Start               End                
  <dbl> <dttm>                      <dbl>         <dbl> <dttm>              <dttm>             
1     1 2020-01-29 08:45:00            13            14 2020-01-29 08:45:00 NA                 
2     2 2020-01-29 09:39:00            13            14 2020-01-29 09:39:00 NA                 
3     2 2020-01-28 20:11:00            13            14 2020-01-28 20:11:00 2020-01-29 06:24:00
4     2 2020-01-26 16:12:00            13            14 2020-01-26 16:12:00 2020-01-26 17:34:00
5     3 2020-01-26 13:58:00            13            14 2020-01-26 13:58:00 NA                 
6     3 2020-01-25 13:43:00            -3            14 2020-01-25 13:43:00 2020-01-26 09:47:00
7     4 2020-01-21 11:44:00            13            14 2020-01-21 11:44:00 2020-01-22 10:24:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...