У меня этот фрейм данныхДобавление столбцов на основе заказа и группировка
dat = data.frame(ID= c(1,1,1,2,3,3),
NumberInSequence= c(1,2,3,1,1,2),
StartTime = as.POSIXct(c("2016-01-01 05:52:05 GMT","2016-01-01 05:52:11 GMT","2016-01-01 05:52:16 GMT","2016-01-01 05:40:05 GMT","2016-01-01 06:12:13 GMT","2016-01-01 07:12:26 GMT")) ,
EndTime = as.POSIXct(c("2016-01-01 05:52:10 GMT","2016-01-01 05:52:16 GMT","2016-01-01 05:52:30 GMT","2016-01-01 05:46:05 GMT","2016-01-01 06:12:25 GMT","2016-01-01 08:00:00 GMT") )
)
dat
ID NumberInSequence StartTime EndTime
1 1 1 2016-01-01 05:52:05 2016-01-01 05:52:10
2 1 2 2016-01-01 05:52:11 2016-01-01 05:52:16
3 1 3 2016-01-01 05:52:16 2016-01-01 05:52:30
4 2 1 2016-01-01 05:40:05 2016-01-01 05:46:05
5 3 1 2016-01-01 06:12:13 2016-01-01 06:12:25
6 3 2 2016-01-01 07:12:26 2016-01-01 08:00:00
Каждый идентификатор может иметь 1 или более строк, и каждая строка в порядке времени для каждого ID. Я хотел бы добавить 2 столбца:
1-я колонка: «Продолжительность», длина которой в секундах, МЕЖДУ конечным временем идентификатора до следующего времени начала того же идентификатора.
2-я колонка: «Следующее время начала», которое является фактическим следующим стартовым временем того же идентификатора.
Таким образом, результаты должны выглядеть следующим образом:
Дат $ Продолжительность =?
dat $ NextStartTime =?
ID NumberInSequence StartTime EndTime Duration NextStartTime
1 1 1 2016-01-01 05:52:05 2016-01-01 05:52:10 1 2016-01-01 05:52:11
2 1 2 2016-01-01 05:52:11 2016-01-01 05:52:16 0 2016-01-01 05:52:16
3 1 3 2016-01-01 05:52:16 2016-01-01 05:52:30 NA NA
4 2 1 2016-01-01 05:40:05 2016-01-01 05:46:05 NA NA
5 3 1 2016-01-01 06:12:13 2016-01-01 06:12:25 3601 2016-01-01 07:12:26
6 3 2 2016-01-01 07:12:26 2016-01-01 08:00:00 NA NA
Например, для ID = 3 число в ПОСЛЕДОВАТЕЛЬНОСТИ = 1 конечное время составляет 61 секунд, так что продолжительность составляет 61 и в следующий раз старт 7:12:26 от ID = 3 и номер в последовательности = 2.
Для строк, где есть нет следующего раза старта NA должен выглядеть как ID = 2 и число в последовательности = 1.
Я смотрел делать это с dplyr как-то ....
######## ОБНОВЛЕНИЕl ead() - ответ, но есть незначительная проблема. Пожалуйста, просмотреть этот
using dplyr lead but with some contraints
'Даты%>% group_by (ID),%>% мутирует (NextStartTime = свинец (время_запуск), длительность = difftime (NextStartTime, EndTime, ед = 'с'))' возможно – alistaire
Спасибо, вы можете посмотреть здесь http://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875