查找间隔集/高效重叠连接之间的重叠

时间:2014-09-12 18:59:40

标签: r data.table dplyr

概述:

我需要加入两个表:

ref包含时间间隔(从t1t2)以及每个时间间隔的id和发生此时间间隔的space。< / p>

map包含时区(t1t2),每个时间间隔的结果为res及其对应的space

我希望获取/加入mapref区间ref的所有间隔(及其得分)。

例如:

ref <- data.table(space=rep('nI',3),t1=c(100,300,500),t2=c(150,400,600),id=letters[1:3])

map <- data.table(space=rep('nI',241),t1=seq(0,1200,by=5),t2=seq(5,1205,by=5),res=rnorm(241))
他们看起来像是:

> ref
space  t1  t2 id
1:    nI 100 150  a
2:    nI 300 400  b
3:    nI 500 600  c

> map
space   t1   t2        res
1:    nI    0    5 -0.7082922
2:    nI    5   10  1.8251041
3:    nI   10   15  0.2076552
4:    nI   15   20  0.8047347
5:    nI   20   25  2.3388920
---                           
237:    nI 1180 1185  1.0229284
238:    nI 1185 1190 -0.3657815
239:    nI 1190 1195  0.3013489
240:    nI 1195 1200  1.2947271
241:    nI 1200 1205 -1.5050221

(更新)解决方案

  • ?data.table::foverlaps是关键所在。

我需要加入map "within" ref间隔nomatch=0L的所有setkey(ref,space,t1,t2) foverlaps(map,ref,type="within",nomatch=0L) 间隔,我对与此密钥不匹配的间隔不感兴趣所以请使用space t1 t2 id i.t1 i.t2 res 1: nI 100 150 a 100 105 -0.85202726 2: nI 100 150 a 105 110 0.79748876 3: nI 100 150 a 110 115 1.49894097 4: nI 100 150 a 115 120 0.47719957 5: nI 100 150 a 120 125 -0.95767896 6: nI 100 150 a 125 130 -0.51054673 7: nI 100 150 a 130 135 -0.08478700 8: nI 100 150 a 135 140 -0.69526566 9: nI 100 150 a 140 145 2.14917623 10: nI 100 150 a 145 150 -0.05348163 11: nI 300 400 b 300 305 0.28834548 12: nI 300 400 b 305 310 0.32449616 13: nI 300 400 b 310 315 1.16107248 14: nI 300 400 b 315 320 1.08550676 15: nI 300 400 b 320 325 0.84640788 16: nI 300 400 b 325 330 -2.15485447 17: nI 300 400 b 330 335 1.59115714 18: nI 300 400 b 335 340 -0.57588128 19: nI 300 400 b 340 345 0.23957563 20: nI 300 400 b 345 350 -0.60824259 21: nI 300 400 b 350 355 -0.84828189 22: nI 300 400 b 355 360 -0.43528701 23: nI 300 400 b 360 365 -0.80026281 24: nI 300 400 b 365 370 -0.62914234 25: nI 300 400 b 370 375 -0.83485164 26: nI 300 400 b 375 380 1.46922713 27: nI 300 400 b 380 385 -0.53965310 28: nI 300 400 b 385 390 0.98728765 29: nI 300 400 b 390 395 -0.66328893 30: nI 300 400 b 395 400 -0.08182384 31: nI 500 600 c 500 505 0.72566100 32: nI 500 600 c 505 510 2.27878366 33: nI 500 600 c 510 515 0.72974139 34: nI 500 600 c 515 520 -0.35358019 35: nI 500 600 c 520 525 -1.20697646 36: nI 500 600 c 525 530 -0.01719057 37: nI 500 600 c 530 535 0.06686472 38: nI 500 600 c 535 540 -0.40866088 39: nI 500 600 c 540 545 -1.02697573 40: nI 500 600 c 545 550 2.19822065 41: nI 500 600 c 550 555 0.57075648 42: nI 500 600 c 555 560 -0.52009726 43: nI 500 600 c 560 565 -1.82999177 44: nI 500 600 c 565 570 2.53776578 45: nI 500 600 c 570 575 0.85626293 46: nI 500 600 c 575 580 -0.34245708 47: nI 500 600 c 580 585 1.21679869 48: nI 500 600 c 585 590 1.87587020 49: nI 500 600 c 590 595 -0.23325264 50: nI 500 600 c 595 600 0.18845022 space t1 t2 id i.t1 i.t2 res

{{1}}

给出:

{{1}}

1 个答案:

答案 0 :(得分:17)

哈,好时机:)。就在几天前,实施了重叠连接(或间隔连接)。 in data.table函数为foverlaps(),可从github project page获得。请务必查看?foverlaps

setkey(ref, space, t1, t2)
foverlaps(map, ref, type="within", nomatch=0L)

我认为这就是你所追求的。只有在匹配的情况下才会生成加入结果,并且t1,t2 ref mapspace之间的space重叠}标识符..如果您不想要,请从关键列中删除nomatch=0L。如果您想要所有匹配项,请删除nomatch=NA - 默认值为{{1}},返回全部匹配项。

该功能是新的(但已经过严格测试),因此功能不完整。如果您有任何改进建议或遇到任何问题,请随时提出问题。