r - 通过一个具有动态容差的数值变量连接两个 data.tables
问题描述
我有两个 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=.()”功能。我试图从通过带有错误范围的测量值连接数据帧中调整代码,但由于某种原因我无法运行,..
我的示例所需的输出是:
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))
先感谢您!
解决方案
这是一种使用foverlaps()
from的方法data.table
。
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
推荐阅读
- debugging - 一种让 GDB 从本地 sysroot 和远程 gdbserver 加载库的方法
- java - 流式传输和过滤字符串以获取 char[] 数组
- azure - HttpClient 通过 Azure Functions 依赖注入处理
- angular - 如何根据属性以角度输出带有 *ngFor 的组?
- javascript - res.redirect 导致 .catch 语句出错
- sublimetext3 - SublimeText - CSSLint 忽略字母顺序
- ios - 错误:类型“UIButton.ButtonType”没有成员“提交”
- c# - 使用 Topshelf 禁用 Windows 服务的暂停、停止和重新启动
- java - Android MapView,如何在按钮按下时更改位置/标记
- firebase - 是否有任何 Firebase 控制台桌面客户端?