Как извлечь даты начала и окончания из одного столбца в большом наборе данных в R, используя lubridate? - PullRequest
0 голосов
/ 18 мая 2018

Я хотел бы выполнить что-то очень похожее на то, что делается в этом вопросе .У меня есть большой data.table (или data.frame) с одним столбцом, который имеет базовую метку времени (BST).Мне нужно определить количество дней для каждого из уникальных идентификаторов, которое может быть много десятков тысяч строк.Все учебники по lubridate, которые я нашел, начинаются с очень простого примера от начала до конца ... ( это отличное вступление, но не тот ответ, который я ищу ).

Мне нужно пройтись по моему столбцу BST и определить дату начала и окончания для каждого идентификатора.

Вот пример данных:

library(data.table)

myID <- c(1,1,1,1,1,1,2,2,2,2,2,2)
BST <- c("2017-06-01 00:00:01", "2017-06-01 00:00:02",
         "2017-06-02 00:00:01", "2017-06-02 00:00:02", 
         "2017-06-03 00:00:01", "2017-06-03 00:00:02",
         "2017-06-01 00:00:01", "2017-06-01 00:00:02", 
         "2017-06-03 00:00:01", "2017-06-03 00:00:02", 
         "2017-06-05 00:00:01", "2017-06-05 00:00:02")
V3 <- c("a", "a", "a", "a", "a", "a", "b", "b", "b","b", "b", "b")
dt1 <- data.table(myID, BST, V3)

И желаемый результат:

enter image description here

А как тогда этодостигается при сохранении всех исходных строк ... a la dplyr :: mutate ()?

Второй желаемый результат:

enter image description here

1 Ответ

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

Вы можете попробовать преобразовать BST в date/time, используя lubridate::ymd_hms, а затем сгруппировать по myID, чтобы взять минимум BST как startDates и максимум BST как endDates.

library(data.table)
library(lubridate)
dt1[,.(startDates= min(ymd_hms(BST)), endDates = max(ymd_hms(BST))), by=myID]
#   myID          startDates            endDates
#1:    1 2017-06-01 00:00:01 2017-06-03 00:00:02
#2:    2 2017-06-01 00:00:01 2017-06-05 00:00:02
...