2016-09-26 4 views
0

У меня этот фрейм данныхДобавление столбцов на основе заказа и группировка

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

+1

'Даты%>% group_by (ID),%>% мутирует (NextStartTime = свинец (время_запуск), длительность = difftime (NextStartTime, EndTime, ед = 'с'))' возможно – alistaire

+0

Спасибо, вы можете посмотреть здесь http://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875

ответ

1

Для NextStartTime, пока ваши данные в порядке (используйте arrange(ID, NumberInSequence), если не уверены), вы можете использовать dplyr::lead, который походит на stats::lag временного ряда с отрицательным лагом.

Для Duration вы можете вычитать время, но если единицы могут быть на разных единицах величины, безопаснее использовать difftime, чтобы вы могли поддерживать последовательные единицы.

Все вместе:

library(dplyr) 

dat %>% group_by(ID) %>% 
    arrange(ID, NumberInSequence) %>% # not necessary if already arranged, as here 
    mutate(NextStartTime = lead(StartTime), 
      Duration = difftime(NextStartTime, EndTime, units = 's')) 

## Source: local data frame [6 x 6] 
## Groups: ID [3] 
## 
##  ID NumberInSequence   StartTime    EndTime  NextStartTime Duration 
## <dbl>   <dbl>    <dttm>    <dttm>    <dttm> <time> 
## 1  1    1 2016-01-01 05:52:05 2016-01-01 05:52:10 2016-01-01 05:52:11 1 secs 
## 2  1    2 2016-01-01 05:52:11 2016-01-01 05:52:16 2016-01-01 05:52:16 0 secs 
## 3  1    3 2016-01-01 05:52:16 2016-01-01 05:52:30    <NA> NA secs 
## 4  2    1 2016-01-01 05:40:05 2016-01-01 05:46:05    <NA> NA secs 
## 5  3    1 2016-01-01 06:12:13 2016-01-01 06:12:25 2016-01-01 07:12:26 3601 secs 
## 6  3    2 2016-01-01 07:12:26 2016-01-01 08:00:00    <NA> NA secs 
+0

Привет @alistaire это почти работает полностью. Вы можете посмотреть здесь http://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875

Смежные вопросы