Я хотел бы использовать foverlaps, чтобы найти пересекающиеся диапазоны двух файлов кроватей, и свернуть все строки, содержащие перекрывающиеся диапазоны, в одну строку. В приведенном ниже примере у меня есть две таблицы с геномными диапазонами. Таблицы называются "лежачими" файлами, которые имеют начальные координаты, начинающиеся с нуля, и конечные позиции элементов в хромосомах, основанные на единицах. Например, START = 9, STOP = 20 интерпретируется как диапазон от 10 до 20 включительно. Эти файлы кроватей могут содержать миллионы строк. Решение должно было бы дать один и тот же результат, независимо от порядка, в котором предоставляются два файла для пересечения.
Первый стол
> table1
CHROMOSOME START STOP
1: 1 1 10
2: 1 20 50
3: 1 70 130
4: X 1 20
5: Y 5 200
Вторая таблица
> table2
CHROMOSOME START STOP
1: 1 5 12
2: 1 15 55
3: 1 60 65
4: 1 100 110
5: 1 130 131
6: X 60 80
7: Y 1 15
8: Y 10 50
Я думал, что новая функция foverlaps может быть очень быстрым способом найти пересекающиеся диапазоны в этих двух таблицах, чтобы получить таблицу, которая будет выглядеть следующим образом:
Таблица результатов:
> resultTable
CHROMOSOME START STOP
1: 1 5 10
2: 1 20 50
3: 1 100 110
4: Y 5 50
Это возможно, или есть лучший способ сделать это в data.table?
Я также хотел бы сначала подтвердить, что в одной таблице для любой заданной CHROMOSOME координата STOP не перекрывается с начальной координатой следующей строки. Например, ХРОМОСОМУ Y: 1-15 и ХРОМОСОМУ Y: 10-50 необходимо свернуть до ХРОМОСОМЫ Y: 1-50 (см. Строки второй таблицы 7 и 8). Это не должно иметь место, но функция, вероятно, должна проверить это. Реальный пример того, как следует перекрывать потенциальные перекрытия, приведен ниже:
CHROM START STOP
1: 1 721281 721619
2: 1 721430 721906
3: 1 721751 722042
Желаемый вывод:
CHROM START STOP
1: 1 721281 722042
Функции для создания таблиц примеров следующие:
table1 <- data.table(
CHROMOSOME = as.character(c("1","1","1","X","Y")) ,
START = c(1,20,70,1,5) ,
STOP = c(10,50,130,20,200)
)
table2 <- data.table(
CHROMOSOME = as.character(c("1","1","1","1","1","X","Y","Y")) ,
START = c(5,15,60,100,130,60,1,10) ,
STOP = c(12,55,65,110,131,80,15,50)
)