【问题标题】:Join two data.tables by one numeric variable with dynamic tolerance通过一个具有动态容差的数值变量连接两个 data.tables
【发布时间】:2019-11-18 23:05:12
【问题描述】:

我有两个 data.tables 我想通过一个数字变量(双精度)加入。然而,数值变量存在不确定性。因此,我必须允许一个特定的容差,该容差因变量而异。

在下面的示例中,“mz”是我想加入 DT1 和 DT2 的变量。从变量 iso_mz 计算的公差:iso_mz * 5e-6。

DT1 <- data.table(mz = c(433.231512451172, 451.091953822545, 454.347605202415, 490.167234693255, 518.225894504123), 
Var1 = c(433.231018066406, 451.091430664062, 454.347015380859, 490.166381835938, 518.22509765625), 
Var2 = c(433.232147216797, 451.092559814453, 454.34814453125, 490.168273925781, 518.2265625))


DT2 <- data.table(iso_mz = c(451.0900, 490.1651, 518.2281, 433.2335), 
comp = c("m1", "m2", "m3", "m4"))

如果我不必使用容差,我会使用 data.table 包的“on=.()”功能。我试图从Joining Data Frames by Measured Values with an Error Range 调整代码,但由于某种原因我无法运行,..

我的示例所需的输出是:

Output <- data.table(
iso_mz = c(433.2335, 451.0900, 490.1651, 518.2281), 
comp = c("m4", "m1", "m2", "m3"),
mz = c(433.231512451172, 451.091953822545, 490.167234693255, 518.225894504123), 
Var1 = c(433.231018066406, 451.091430664062, 490.166381835938, 518.22509765625), 
Var2 = c(433.232147216797, 451.092559814453, 490.168273925781, 518.2265625))

提前谢谢你!

【问题讨论】:

    标签: r dataframe merge data.table jointable


    【解决方案1】:

    这是一种使用来自data.tablefoverlaps() 的方法。

    tolerance = 5e-6
    #create ranges to join on
    DT1[, `:=`(min = mz - mz * tolerance, 
               max = mz + mz * tolerance) ]
    DT2[, `:=`(min = iso_mz - iso_mz * tolerance, 
               max = iso_mz + iso_mz * tolerance) ]
    #set keys
    setkey(DT1, min, max )
    setkey(DT2, min, max )
    #perform overlap join, order, remove min-max columns
    ans <- setorder( foverlaps( DT2, DT1 ), mz)[, `:=`(min=NULL,max=NULL,i.min=NULL,i.max=NULL)][]
    
    
    # mz     Var1     Var2   iso_mz comp
    # 1: 433.2315 433.2310 433.2321 433.2335   m4
    # 2: 451.0920 451.0914 451.0926 451.0900   m1
    # 3: 490.1672 490.1664 490.1683 490.1651   m2
    # 4: 518.2259 518.2251 518.2266 518.2281   m3
    
    
    #check
    all.equal( setcolorder(ans, names(Output)), Output )
    [1] TRUE
    

    【讨论】:

    • 感谢您的快速回复。对于 mzmin/mzmax 变量的混淆感到抱歉。它们不表示公差,而只是我想保留在这些行中的附加变量,这就是我将它们留在示例中的原因。 433.2335 - 433.2335*5e-6 [1] 433.2313 433.2335 + 433.2335*5e-6 [1] 433.2357 因此:433.2315 在范围内
    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 2019-08-23
    • 2014-05-07
    • 2016-10-24
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多