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

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

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
Другие вопросы по тегам