2016-09-26 5 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 

の列を追加する各IDは、1つの又は複数の行を有することができ、各列は、すべてのIDのために時間順です。

1列目:同じIDの次の開始時刻までのIDのEndTimeの間の時間の長さ(秒単位)を示す「Duration」。

第2列:同じIDの実際の次の開始時刻である「次の開始時刻」。

結果は次のようになります。

dat $ Duration =?

dat $ NextStartTime =? ID = 3 = 1回の終了時間はとても時間が61であり、次の開始時刻は、ID = 3から午前7時12分26秒であり、シーケンス内の数61秒後である配列内の番号については、例えば

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は、シーケンス= 1

にID = 2と番号のように表示されます。何の次回の開始時間がありませんがあり、私は何とか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 =鉛(のStartTime)、持続時間= 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これはほぼ完全に動作します。あなたはここを見てみることができますhttp://stackoverflow.com/questions/39714029/using-dplyr-lead-but-with-some-contraints – user3022875

関連する問題