Using non-equi
从 data.table v1.9.7 的当前开发版本加入(请参阅安装说明 https://github.com/Rdatatable/data.table/wiki/Installation),它允许为连接提供非相等条件:
require(data.table) # v1.9.7
names(ll) = c("Area1", "Area2")
A = rbindlist(lapply(ll, as.data.table), idcol = "id") ## (1)
B = as.data.table(mat)
B[, c("RT.minus", "RT.plus") := .(RT.-0.02, RT.+0.02)]
B[, c("m.z.minus", "m.z.plus") := .(m.z.-0.0002, m.z.+0.0002)] ## (2)
ans = A[B, .(id, X., RT. = i.RT., m.z. = i.m.z., Area.),
on = .(RT. >= RT.minus, RT. <= RT.plus,
m.z. >= m.z.minus, m.z. <= m.z.plus)] ## (3)
dcast(ans, RT. + m.z. ~ id) ## (4)
# or dcast(ans, RT. + m.z. ~ id, fill = 0)
# RT. m.z. Area1 Area2
# 1: 1.01 358.9777 2820.1 7820.1
# 2: 1.07 368.4238 NA 8271.8
# 3: 2.03 922.0092 5856.3 NA
# 4: 2.05 284.3295 6674.0 12674.0
# 5: 3.03 261.1299 27814.6 NA
[1] 命名矩阵列表(称为ll
此处)并将它们每个转换为数据表 using lapply()
,并使用按行绑定它们rbindlist
,并将名称添加为额外列 (idcol
)。叫它A
.
[2] 转换第二个矩阵(称为mat
在这里)到数据表以及。添加与您要搜索的范围/间隔相对应的其他列(因为on=
正如我们将在下一步中看到的,参数无法处理表达式yet)。叫它B
.
[3] 执行条件连接/子集。对于中的每一行B
,找到匹配的行A
对应于提供给的条件on=
参数,并提取列id, X., R.T. and m.z.
对于那些匹配的行索引。
[4] 最好将其保留为 [3]。但如果您希望它如答案中所示,我们可以将其重新塑造为宽格式。fill = 0
将取代NA
结果中的 s 为0
.