Агрегированные бункеры в больших GRANGE эффективно

У меня есть SummarizedExperiment (но мы можем считать его GRanges). Я хочу уменьшить количество интервалов, сохраняя только одну строку для каждого идентичного смежного mcol(gr)важно также отслеживать новый интервал продления.

Большое спасибо!

gr <- GRanges(
seqnames = Rle(c("chr1"), c(12)),
ranges = IRanges(1:12*10, end = 1:12*10+5),
state1 = c(1,1,1,1,2,3,4,5,5,5,1,1),
state2 = c(1,1,1,2,2,2,5,5,6,6,1,1))

Получающиеся GRanges должны выглядеть следующим образом:

gr2 <- GRanges(
  seqnames = Rle(c("chr1"), c(8)),
  ranges = IRanges(start = c(10,40,50,60,70,80,90,110),
  end =  c(35,45,55,65,75,85,105,125)),
  state1 = c(1,1,2,3,4,5,5,1), state2 = c(1,2,2,2,5,5,6,1))​  

Изменить: я изменил Granges так, чтобы пара состояний присутствовала также в несмежных интервалах (эта вторая 1,1-пара должна сообщаться независимо от первого) Извините, мое первоначальное решение также было неверным!

Большое спасибо!

1 ответ

Решение

Создайте искусственный фактор, убедитесь, что уровни в порядке появления в факторе (а не в алфавитном порядке по умолчанию), чтобы избежать реорганизации GRanges, и разбейте GRanges объект

f0 = paste(gr$state1, gr$state2, sep=".")
f = factor(f0, levels=unique(f0))
grl = split(gr, f)

Получить диапазоны и соответствующие метаданные

grf = unlist(range(grl), use.names=FALSE)
mcols(grf) = mcols(gr)[!duplicated(f),]

split(), range(), а также unlist() все должно быть "быстро" для данных такого размера.

Чтобы также разделить на хромосому, добавьте это к фактору

f0 = paste(seqnames(gr), gr$state1, gr$state2, sep=".")

Чтобы разделить каким-либо другим способом, например, только когда состояния являются смежными, найдите способ сделать соответствующий фактор, например,

f0 = paste(
    seqnames(gr),
    cumsum(c(TRUE, diff(gr$state1) != 0)),
    cumsum(c(TRUE, diff(gr$state2) != 0)),
    sep=".")

Задавайте вопросы о пакетах Bioconductor на сайте поддержки Bioconductor.

Другие вопросы по тегам