2017-06-19 5 views
0

標準的なデータフレームがあり、ある期間にわたって特定の動作をしている人がいます。以前のインシデント(遅延< = 50)の50秒以内にインシデントが発生した場合は、これを以前のインシデントと組み合わせたいと思います。つまり、各インシデントには、遅延(最初のインシデント)または遅延> 50が含まれます。開始時刻は最初のインシデント(NAまたは> 50)の開始時刻になり、終了時刻は最後のインシデントの時刻になります< = 50(下記のデータの例を参照)。組み合わせたインシデント内でX1の合計も欲しいと思います。うまくいけば、以下のデータは私が探しているものを正確に明確にします。基準を満たす行を組み合わせるR

オリジナルデータ:

ID   Incident Start End  X1 Delay 
Person A 1   747  748  735 NA 
Person A 2   868  882  384 120 
Person A 3   998  999  354 116 
Person A 4   1057 1059 382 58 
Person A 5   1063 1064 138 4 
Person A 6   1077 1078 138 13 
Person A 7   1412 1413 384 334 
Person B 1   739  740  387 NA 
Person B 2   742  743  132 2 
Person B 3   760  761  386 17 
Person B 4   768  769  731 7 
Person B 5   835  835  894 66 
Person B 6   838  839  891 3 
Person B 7   925  926  385 86 

目的のデータ:

ID   Iteration Start End  X1  Delay 
Person A 1   747  748  735  NA 
Person A 2   868  882  384  120 
Person A 3   998  999  354  116 
Person A 4   1057 1078 658  58 
Person A 5   1412 1413 384  334 
Person B 1   739  769  1636 NA 
Person B 2   835  839  1785 66 
Person B 3   925  926  385  86 

同じ人が2つの別々の事件があるかもしれないので、私は問題は、私はちょうどIDによる集計することはできませんで、複数のものを試してみました。

ありがとうございます!それ以上の情報が必要な場合はお知らせください。

+0

人A、インシデント7が含まれていない理由はありますか? –

答えて

0

私はあなたが望む結果表に間違いがあると思います。 5行目はPerson Aでなければなりません。

dplyrでこれを行う方法があります。その根拠は、最初にcumsumを使って指標を組み合わせることです。遅延が50以上であれば、インシデント番号は1つ増えます。その後、この新しいインシデントの列にsummariseと記載されています。

df%>% 
    group_by(ID)%>% 
    mutate(Incident=cumsum(Delay>50|is.na(Delay)))%>% 
    group_by(ID,Incident)%>% 
    summarise(Start=first(Start),End=last(End),X1=sum(X1),Delay=first(Delay)) 

     ID Incident Start End X1 Delay 
    <chr> <int> <int> <int> <int> <int> 
1 PersonA  1 747 748 735 NA 
2 PersonA  2 868 882 384 120 
3 PersonA  3 998 999 354 116 
4 PersonA  4 1057 1078 658 58 
5 PersonA  5 1412 1413 384 334 
6 PersonB  1 739 769 1636 NA 
7 PersonB  2 835 839 1785 66 
8 PersonB  3 925 926 385 86 

データ

df <- read.table(text="ID Incident Start End X1 Delay 
PersonA 1   747  748  735 NA 
PersonA 2   868  882  384 120 
PersonA 3   998  999  354 116 
PersonA 4   1057 1059 382 58 
PersonA 5   1063 1064 138 4 
PersonA 6   1077 1078 138 13 
PersonA 7   1412 1413 384 334 
PersonB 1   739  740  387 NA 
PersonB 2   742  743  132 2 
PersonB 3   760  761  386 17 
PersonB 4   768  769  731 7 
PersonB 5   835  835  894 66 
PersonB 6   838  839  891 3 
PersonB 7   925  926  385 86",header=TRUE,stringsAsFactors=FALSE) 
+0

完璧な応答。私は "希望する結果の表"のエラーを修正しました。 – Fargonian

+0

これはまさに私が探していたものです。もう一つの質問があります。今のところ、Delay <50のしきい値が満たされると、それは以前の事件とまったく同じです(それはまさに私がやりたいことです)。それを後の事件と組み合わせるためにコードをどのように変更しますか?例えば、所望のデータでは、Line4 Person A変数X1が658であり、Line5 Person A変数X1が660(138 + 138 + 384)である。それは理にかなっていますか? – Fargonian

関連する問題