【问题标题】:R join table based on ID and Date, complex rolling join?基于ID和日期的R连接表,复杂的滚动连接?
【发布时间】:2016-10-14 21:25:04
【问题描述】:

我必须连接两个数据表来获取一个零件的part_ID,我需要预测该零件是否会失败(part_ID 不在测试数据中)。我正在努力正确地加入表格。

机器有 4 件处于活动状态,part_A、part_B、Part_C、part_D。我目前有每个安装的日期(日期表)和每秒进行的测量,这些测量对应于以秒为单位的时间戳(SensorData)的部分。我可以对 machine_ID 和添加 Part_ID 的日期进行滚动连接,但如果 part_ID 0 安装于 2016 年 1 月 1 日,part_B 安装于 2016 年 2 月 2 日,这并不意味着 part_A 已被删除(尽管它可以已经),只是添加了另一部分并删除了某些内容(不是我要解决的问题的一部分)。如何连接这两个表以保留 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      

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    我将假设您的日期和时间戳采用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 来运行上述程序。

    【讨论】:

    • 解决方案看起来是正确的路径,但我收到以下错误。
    • 'vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : Join 结果为 2981318 行;超过 428002 = nrow(x)+nrow( i). 检查 i 中的重复键值,每个键值都加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 为每个组运行 j 以避免大分配。如果您确定如果您希望继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。'
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多