我发现其他帖子一般在R iRanges中找到重叠范围,但是你能帮我解决这个额外的小扭曲:我有两个链接的范围(可能的基因组重排与起始范围和结束范围)和我想过滤掉母亲基因组中相同的范围
我找到了停止和开始的范围如下(chr数,间隔开始,间隔结束),其中左边的3列显示重新排列的开始,右边的3列显示重排的结束(它们是名为SVDetect的程序的输出,它使用NGS数据来查找与参考基因组具有异常比对的配偶对)。我有两个基因组,母克隆和女儿,并希望找到重新排列,这对于女儿是唯一的=我想过滤出两个范围与另一个范围内的两个范围的相同行重叠的行。范围可能有点不同但如果两个范围重叠,则强烈表明重排已经存在于母亲中。 R中的iRanges允许您轻松查看范围是否与其他范围重叠但我无法找到一个解决方案,它可以显示它重叠的范围,而不是非常慢的for循环。
子:
1 1384138 1384862 - 1 516731 516918
2 3758860 3759278 - 2 879828 879966 # (filter away this line as overlap with below)
2 3940051 3940470 - 2 3940856 3941250
母亲:
2 3758858 3759282 - 2 879828 879966 # (overlap with this range)
1 1384138 1384862 - 3 116231 516918
2 3940051 3940470 - 3 1540856 3941250
答案 0 :(得分:0)
诀窍是使用两组GRanges,一组用于重新排列开始,一组用于重新排列结束,然后将结果组合如下:
### Create GRanges for daughter - copied from example
daughterStart <- GRanges(c(1,2,2), IRanges(c(1384138,3758860,3940051), c(1384862,3759278,3940470)))
daughterEnd <- GRanges(c(1,2,2), IRanges(c(516731,879828,3940856), c(516918,879966,3941250)))
### Create GRanges for mother - copied from example
motherStart <- GRanges(c(2,1,2), IRanges(c(3758858,1384138,3940051), c(3759282,1384862,3940470)))
motherEnd <- GRanges(c(2,3,3), IRanges(c(879828,116231,1540856), c(879966,516918,3941250)))
然后我们使用findOverlaps()函数使用女儿作为查询来确定是否存在任何重叠,因为我们询问女儿重排是否与母亲重新排列重叠(使用suppressWarnings()因为GRanges具有不同的seqlevels(染色体)和从而发出警告):
starOverlap <- suppressWarnings( findOverlaps(query = daughterStart, subject = motherStart) ) # suppressWarnings to ignore wanings about different chromosomes
endOverlap <- suppressWarnings( findOverlaps(query = daughterEnd, subject = motherEnd ) )
最后我们确定重排 - 开始和重新排列 - 结束重叠是否存在任何相同的重叠:
> starOverlap %in% endOverlap
[1] FALSE TRUE FALSE
可以通过添加一个来获取不重叠的女儿对的索引!
> starOverlap@queryHits[ ! (starOverlap %in% endOverlap) ]
[1] 1 3
由于这种方法依赖于findOverlaps并且是矢量化的,因此它可以快速进行数百万次重排