R: найти перекрывающиеся области с помощью R

У меня есть набор данных, который содержит начальное и конечное положение сегментов в определенных местах (скаффолде), некоторые из этих сегментов перекрываются с другими, если они находятся в одном и том же каркасе.

> head(jobs)
JOB_N      Genome     Scaffold loc_i loc_f
     1 PRJNA179522 Contig10285  1251  1502
     1 PRJNA179522 Contig10285  1251  1602
     2 PRJNA179522 Contig10285  1255  1499
     2 PRJNA179522 Contig10285   828  1076
     2 PRJNA179522 Contig783     245  1487
     2 PRJNA179522 Contig783     822  1073    

Я хочу две вещи: первая — найти все перекрывающиеся области во всех отдельных каркасах. Второй — получить новую таблицу, содержащую только первую и последнюю позиции каждого «нового» сегмента. Результат будет:

JOB_N      Genome     Scaffold loc_i loc_f
     1 PRJNA179522 Contig10285  1251  1602
     2 PRJNA179522 Contig10285   828  1076
     2 PRJNA179522 Contig783     245  1487

Заранее спасибо.


person MJRC    schedule 27.02.2016    source источник
comment
См. foverlaps в data.table или findOverlaps в IRanges   -  person MichaelChirico    schedule 27.02.2016


Ответы (1)


Вы указали «индивидуальный каркас», но в выводе вашего примера есть дублированный каркас. Вы также хотите включить JOB_N и Genome в эти группы?

Если да, то один data.table метод состоит в том, чтобы найти min и max из loc_i и loc_f соответственно для каждой требуемой группы.

library(data.table)

dt <- as.data.table(jobs)

dt[, .(min_loc_i = min(loc_i), max_loc_f = max(loc_f)), by=.(JOB_N, Genome, Scaffold)]

#   JOB_N      Genome    Scaffold min_loc_i max_loc_f
#1:     1 PRJNA179522 Contig10285      1251      1602
#2:     2 PRJNA179521 Contig10285      1251      1499
#3:     2 PRJNA179522 Contig10285       828      1076
#4:     2 PRJNA179522   Contig783       245      1487

Если вам нужны только отдельные леса, вам нужно только сгруппировать по scaffold

dt[, .(min_loc_i = min(loc_i), max_loc_f = max(loc_f)), by=.(Scaffold)]
#      Scaffold min_loc_i max_loc_f
#1: Contig10285       828      1602
#2:   Contig783       245      1487
person SymbolixAU    schedule 27.02.2016
comment
Возможно, описание было неправильным. Я предполагаю, что у меня будет много сегментов (экзонов) в каждом каркасе. по этой причине мне нужно найти все перекрывающиеся области. Если вы обратите внимание, в моем примере № 1 и № 2 являются перекрывающимися сегментами, а № 3 — нет. Итак, в скаффолде Contig10285 есть 2 независимых сегмента (не перекрывающихся). Теперь ясно? Спасибо, в любом случае! - person MJRC; 01.03.2016
comment
@MJRC хорошо, теперь я тебя понимаю. Я внесу изменения в свой ответ - person SymbolixAU; 02.03.2016