Сравните два геномных диапазона (R)

У меня есть 2 геномных диапазона

g1<-GRanges(c("chr1:0-14","chr1:15-29"), score=c(20.2,10.4));g1

GRanges object with 2 ranges and 1 metadata column:
   seqnames    ranges strand |     score
      <Rle> <IRanges>  <Rle> | <numeric>
[1]     chr1      0-14      * |      20.2
[2]     chr1     15-29      * |      10.4

g2<-GRanges(c("chr1:0-9","chr1:10-19","chr1:20-29"), state=c('E1','E2','E1'));g2

GRanges object with 3 ranges and 1 metadata column:
   seqnames    ranges strand |       state
      <Rle> <IRanges>  <Rle> | <character>
[1]     chr1       0-9      * |          E1
[2]     chr1     10-19      * |          E2
[3]     chr1     20-29      * |          E1

Я хотел бы сделать их сравнимыми. Сначала я объединил их, а затем использовал disjoin:

g3<-(c(g1,g2)); g3 

GRanges object with 5 ranges and 2 metadata columns:
    seqnames    ranges strand |     score       state
       <Rle> <IRanges>  <Rle> | <numeric> <character>
 [1]     chr1      0-14      * |      20.2        <NA>
 [2]     chr1     15-29      * |      10.4        <NA>
 [3]     chr1       0-9      * |      <NA>          E1
 [4]     chr1     10-19      * |      <NA>          E2
 [5]     chr1     20-29      * |      <NA>          E1

disjoin(g3)
                                                                                                   
 GRanges object with 4 ranges and 0 metadata columns:
   seqnames    ranges strand
      <Rle> <IRanges>  <Rle>
[1]     chr1       0-9      *
[2]     chr1     10-14      *
[3]     chr1     15-19      *
[4]     chr1     20-29      *

Таким образом, disjoin выполняет разделение, которое я хочу, но, к сожалению, не сохраняет метаданные. Есть ли способ сохранить метаданные и получить такие GRange?

 GRanges object with 5 ranges and 2 metadata columns:
   seqnames    ranges strand |     score       state
      <Rle> <IRanges>  <Rle> | <numeric> <character>
[1]     chr1       0-9      *| 20.2    E1
[2]     chr1     10-14      *| 20.2   E2
[3]     chr1     15-19      *| 10.4   E2
[4]     chr1     20-29      *| 10.4   E1

Спасибо


person i love mistaking    schedule 16.03.2021    source источник


Ответы (2)


Я думаю, вы найдете здесь помощь: https://support.bioconductor.org/p/82551/ Но обратите внимание, что в вашем случае это не совсем точно, потому что диапазон на выходе может сопоставляться с несколькими диапазонами на входе.

person Bastien Ducreux    schedule 16.03.2021

Да, определенно with.revmap=T это решение:

g1<-GRanges(c("chr1:0-14","chr1:15-29"), score=c(20.2,10.4));g1
g2<-GRanges(c("chr1:0-9","chr1:10-19","chr1:20-29"), 
state=c('E1','E2','E1'));g2
g3<-(c(g1,g2)); g3 #combining GRanges
g4<-disjoin(g3, with.revmap=TRUE);g4 #disjoining to compare them WITH revmap
l1<-g4$revmap;l1 
score<-extractList(mcols(g3)$score, l1);score 
state<-extractList(mcols(g3)$state, l1);state
na.omit<-function(l){sapply(l, function(x){x[!is.na(x)]})} #remove NA's
mcols(g4)$score<-na.omit(score)
mcols(g4)$state<-na.omit(state)
g4

GRanges object with 4 ranges and 3 metadata columns:
   seqnames    ranges strand |        revmap     score       state
      <Rle> <IRanges>  <Rle> | <IntegerList> <numeric> <character>
[1]     chr1       0-9      * |           1,3      20.2          E1
[2]     chr1     10-14      * |           1,4      20.2          E2
[3]     chr1     15-19      * |           2,4      10.4          E2
[4]     chr1     20-29      * |           2,5      10.4          E1

Теперь я могу легко сравнить состояния с его оценкой, например, сделав ящичковую диаграмму. Спасибо, Бастьен.

person i love mistaking    schedule 17.03.2021