Нахождение совпадений между 2 диапазонами и их длинами перекрывающихся областей?

#r #genome #genomicranges

Вопрос:

Мне нужно найти длину перекрывающейся области на одних и тех же хромосомах между 2 группами(gp1 и gp2). (аналогичный вопрос в stackoverflow отличался от моей цели, потому что я хочу найти перекрывающуюся область, а не ИСТИННЫЙ/ЛОЖНЫЙ ответ).

Например:

 gp1: 
chr   start   end   id1 
chr1  580     600    1
chr1  900     970    2
chr3  400     600    3
chr2  100     700    4
 
 gp2:
chr   start   end   id2
chr1  590     864   1
chr3  550     670   2
chr2  897     1987  3
 

Я ищу способ сравнить эти 2 группы и получить такие результаты:

 id1   id2    chr   overlapped_length
 1     1     chr1     10
 3     2     chr3     50   
 

Комментарии:

1. Какие похожие вопросы по Stackoverflow вы имеете в виду, @hiam?

Ответ №1:

Должно указать вам правильное направление:

Загрузка библиотек

 # install.packages("BiocManager")
# BiocManager::install("GenomicRanges")
library(GenomicRanges)
library(IRanges)
 

Генерировать данные

 gp1 <- read.table(text = 
"
chr   start   end   id1 
chr1  580     600    1
chr1  900     970    2
chr3  400     600    3
chr2  100     700    4
", header = TRUE)

gp2 <- read.table(text = 
                      "
chr   start   end   id2
chr1  590     864   1
chr3  550     670   2
chr2  897     1987  3
", header = TRUE) 
 

Вычисление диапазонов

 gr1 <- GenomicRanges::makeGRangesFromDataFrame(
    gp1, 
    seqnames.field = "chr", 
    start.field = "start", 
    end.field = "end"
)
gr2 <- GenomicRanges::makeGRangesFromDataFrame(
    gp2, 
    seqnames.field = "chr", 
    start.field = "start", 
    end.field = "end"
)
 

Вычисление перекрытий

 hits <- findOverlaps(gr1, gr2)
p <- Pairs(gr1, gr2, hits = hits)
i <- pintersect(p)
 

Результат

 > as.data.frame(i)
  seqnames start end width strand  hit
1     chr1   590 600    11      * TRUE
2     chr3   550 600    51      * TRUE
 

Комментарии:

1. Как findOverlaps() и при подсчете самой соседней строки как попадания, она будет отключена на 1. Хотя отсюда не должно быть слишком сложно попасть в цель.