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