R基于ID和Date连接表,复杂滚动连接?

时间:2016-10-14 21:25:05

标签: r join data.table

我必须连接两个数据表来获取我需要预测零件是否会发生故障的零件的part_ID(part_ID不在测试数据中)。我正在努力正确地加入桌子。

机器有4件活动,part_A,part_B,Part_C,part_D。我目前已经安装了每个日期(日期表),并且每秒测量一次,对应于具有时间戳秒的部分(SensorData)。我可以在machine_ID和添加Part_ID的日期进行滚动连接,但是如果在2016年1月1日安装了part_ID 0且在2016年2月2日安装了part_B,那么这并不意味着part_A已被删除(尽管它可以已经),只是添加了另一件并删除了一些东西(不是我试图解决的问题的一部分)。我如何加入这两个表来保存part_B和part_B的数据,如下所示。

setTimeout()

首选data.table解决方案,但我愿意接受任何解决方案。数据已被粉碎并浓缩到这一点,因此大约有100,000行,因此无论速度如何,任何解决方案都能正常工作。

目前部分有​​效:

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 

但这假设Part_A已被删除且Part_B已安装并产生如下表格:

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

1 个答案:

答案 0 :(得分:3)

我将假设您的日期和时间戳采用<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen" charset="utf-8"> <div class="modal-footer"> <button type="button" class="btn btn-default pull-right">Cancel</button> <button type="button" class="btn btn-primary" data-dismiss="modal">Delete</button> </div>格式。我还想猜你想要什么,但如果猜错了,这应该很容易修改以满足你的确切需求。

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 (1.9.7 +)data.table才能运行上述内容。