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

概述:

我需要join两个表格:

ref包含时间间隔(从t1t2 )以及每个间隔的id和发生间隔的space

map包含时间间隔( t1t2 ),每个时间间隔都有一个结果res和相应的space

我希望获得/join所有的间隔(和他们的分数)的map ,属于ref 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 

(更新)解决scheme

  • ?data.table::foverlaps是这里的关键。

我需要join所有在ref的区间"within"发生的map区间,我对不匹配这个键的区间不感兴趣,所以使用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 

哈,很好的时机:)。 就在几天前,重叠连接(或间隔连接)被执行。 在data.table函数是foverlaps() ,可以从github项目页面获得 。 确保看看?foverlaps

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

我认为这是你以后的事情。 这将只在有匹配的地方产生连接结果,并且它将检查space标识符内的refmap之间的t1,t2重叠。如果不需要,只需从键列中移除space 。 如果你想要所有的匹配,删除nomatch=0L – 默认是nomatch=NA ,这将返回所有。

该function是新的(但已经过严格testing),因此没有function完整。 如果您有任何改进build议或遇到任何问题,请随时提出问题。