2016-09-26 2 views
0

그룹화에 기초한 I는이 데이터 프레임을 각 ID는 하나 개 이상의 행을 가질 수추가 열은 주문 및

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 

이 각 행마다 ID에 대한 시간 정도이다. 2 열을 추가하고 싶습니다.

첫 번째 열 : ID의 EndTime과 동일한 ID의 다음 시작 시간 사이의 시간 (초)입니다.

두 번째 열 : 동일한 ID의 실제 다음 시작 시간 인 "다음 시작 시간".

그래서 결과는 다음과 같아야합니다

날엔 $ 시간을 =?

dat $ NextStartTime =? ID = 3 = 1 종료 시간은 너무 시간이 61이고, 그 다음 시작 시간 ID = 3 내지 7시 12분 26초하고 시퀀스 번호 61 초후이다 SEQUENCE IN 다수 예를 들어

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 

= NA는 ID = 2처럼 표시 및 순서 = 1

어떻게 든 dplyr와 함께이 일을보고 있었다

....

에서 수 있어야에는 다음 시작 시간이없는이 행 2.

######## 업데이트 번호

l ead()가 대답이지만 사소한 문제가 있습니다. 당신이 음의 지연과 시계열에 stats::lag처럼 dplyr::lead을 사용할 수 있습니다 (arrange(ID, NumberInSequence) 모를 경우 사용) 위해 한 데이터이기 때문에,이 게시물을 NextStartTime를 들어

using dplyr lead but with some contraints

+1

'DAT %> % GROUP_BY (ID) %> % 돌연변이 (NextStartTime = 납 (상영 시간) 지속 시간 = difftime (NextStartTime, 종료 시각, 단위 = 'S'))' 어쩌면 – alistaire

+0

고마워, 여기 좀 봐 http://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875

답변

1

를 참조하십시오.

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이 거의 completly 작동합니다. 여기 좀 봐 줄래? http://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875