这是一个可能的foverlaps
解决方案(如Q中所述)。
前两个步骤很简单并且非常惯用,添加一个End列至Ref.table
所以我们会有重叠的间隔,然后将两个数据集键入Chrom
和间隔列(在 v 1.9.5+ 中,您现在可以指定by.x
and by.y
相反)并简单地运行foverlaps
library(data.table)
setDT(Ref.table)[, End := Split]
setkey(Ref.table)
setkey(setDT(data), Chrom, Start, End)
res <- foverlaps(data, Ref.table)
res
# Chrom Split End ID Start i.End Probes
# 1: 1 NA NA 1 1 900 899
# 2: 1 1000 1000 2 500 5000 4500
# 3: 2 2000 2000 3 1000 5000 4000
现在我们有了重叠,我们需要根据匹配增加数据集大小。我们可以将其作为条件is.na(Split)
(这意味着没有发现重叠)。我不确定这部分是否可以更有效地完成
res2 <- res[, if(is.na(Split)) .SD else rbind(.SD, .SD), by = .(ID, Chrom)]
## Or, if you only have one row per group, maybe
## res2 <- res[, if(is.na(Split)) .SD else .SD[c(1L,1L)], by = .(ID, Chrom)]
现在,最后两个步骤将更新End
and Start
列,然后是Probes
根据新列值的列
res2[!is.na(Split), `:=`(i.End = c(Split[1L], i.End[-1L]),
Start = c(Start[-1L], Split[1L] + 1L)),
by = .(ID, Chrom)]
res2[!is.na(Split), Probes := i.End - Start]
res2
# ID Chrom Split End Start i.End Probes
# 1: 1 1 NA NA 1 900 899
# 2: 2 1 1000 1000 500 1000 500
# 3: 2 1 1000 1000 1001 5000 3999
# 4: 3 2 2000 2000 1000 2000 1000
# 5: 3 2 2000 2000 2001 5000 2999
(如果您愿意,可以删除不需要的列)