2016-10-14 7 views
1

2つのデータテーブルを結合して、パートのpart_IDを取得する必要があります。パートが失敗するかどうかを予測する必要があります(part_IDはテストデータにありません)。私はテーブルを正しく結合するのに苦労しています。IDと日付に基づくRの結合テーブル、複雑なローリング結合?

機械には、part_A、part_B、Part_C、part_Dの4つの部分があります。私は現在、それぞれがインストールされた日付(日付表)と、タイムスタンプが2番目の部分(SensorData)に対応する毎秒の測定値を持っています。 part_ID 0が2011年1月1日にインストールされ、part_Bが2/2/2016にインストールされていれば、part_Aが削除されたことを意味するわけではありません(ただし、私は解決しようとしている問題の一部ではありません)が削除されました。以下に示すように、2つのテーブルを結合してpart_Bおよびpart_Bのデータを保持するにはどうすればよいですか。

SensorData 
ID timestamp   v1 v2 v3 ... v28 Machine_ID 
1 1/1/2016 12:00:13 .001 .123 1.3 ... 24.6 23 
2 1/1/2016 12:00:14 .002 .122 1.2 ... 24.9 14 
3 1/1/2016 12:00:15 .005 .025 NA ... 23.1 6 
4 1/2/2016 12:00:15 .005 .025 NA ... 23.1 6 

Dates 
InstallDate Part_ID Machine_ID 
1/1/2016 0  23 
1/1/2016 2  14 
1/1/2016 16  6 
1/2/2016 24  6 

Results 
ID timestamp   v1 v2 v3 ... v28 Machine_ID Part_A Part_B 
1 1/1/2016 12:00:13 .001 .123 1.3 ... 24.6 23   0  NA 
2 1/1/2016 12:00:14 .002 .122 1.2 ... 24.9 14   2  NA 
3 1/1/2016 12:00:15 .005 .025 NA ... 23.1 6   16  NA 
4 1/2/2016 12:00:15 .005 .025 NA ... 23.1 6   16  24 

data.tableの解決策が推奨されますが、私はすべての解決策に開放されています。データはこの時点まで細断され、約100,000行に圧縮されているため、速度に関係なくあらゆるソリューションが動作します。

これは現在、部分的に動作します:

setkey(Dates, Machine_ID, InstallDate) 
setkey(SensorData, Machine_ID, timestamp) 
dx<-SensorData[Dates, roll=T] 

しかし、これはPart_Aを除去し、Part_Bがインストールされていたし、このようなテーブルを生成する前提としています

IncorrectResults 
ID timestamp   v1 v2 v3 ... v28 Machine_ID Part_A 
1 1/1/2016 12:00:13 .001 .123 1.3 ... 24.6 23   0  
2 1/1/2016 12:00:14 .002 .122 1.2 ... 24.9 14   2  
3 1/1/2016 12:00:15 .005 .025 NA ... 23.1 6   16  
4 1/2/2016 12:00:15 .005 .025 NA ... 23.1 6   24  

答えて

3

私はあなたの日付とタイムスタンプを前提とするつもりですPOSIXct形式です。私もあなたが望むものを少し推測していますが、私が間違って推測すれば、あなたの正確なニーズに合わせて修正するのは簡単です。

# add a part number column 
Dates[, Part_Num := paste0("Part_", LETTERS[1:.N]), by = Machine_ID] 

# do a non-equi join, and dcast the result 
dcast(Dates[SensorData, on = .(Machine_ID, InstallDate <= timestamp)], 
     ... ~ Part_Num, value.var = 'Part_ID') 
#   InstallDate Machine_ID ID v1 v2 v3 v28 Part_A Part_B 
#1: 2016-01-01 12:00:13   23 1 0.001 0.123 1.3 24.6  0  NA 
#2: 2016-01-01 12:00:14   14 2 0.002 0.122 1.2 24.9  2  NA 
#3: 2016-01-01 12:00:15   6 3 0.005 0.025 NA 23.1  16  NA 
#4: 2016-01-02 12:00:15   6 4 0.005 0.025 NA 23.1  16  24 

あなたはlatest devel version(1.9.7+)data.tableの上記を実行する必要があります。

+0

解決策は正しいパスのように見えますが、次のエラーが表示されます。 – DerekB77

+0

'vecseqのエラー(f__、len__、if(allow.cartesian || notjoin ||!anyDuplicated(f__、: )2981318行の結果が428002 = nrow(x)+ nrow(i) xの同じグループに何度も何度も参加しているキー値を返します。大丈夫なら、大きな割り当てを避けるために、各グループに対してjを実行するように.EACHIを試してください。 allow.cartesian = TRUEを指定してください。そうでない場合は、FAQ、Wiki、Stack Overflow、datatable-helpの中でこのエラーメッセージを探してください。 ' – DerekB77

+1

ok ..エラーメッセージを読んでください.. – eddi

関連する問題