У меня есть огромный фрейм данных df
, который включает информацию о перекрывающихся интервалах (A) и (B) и о том, на какой хромосоме (chrom) они были расположены. Также имеется информация о величине (уровне экспрессии гена), наблюдаемой в интервале (A).
chrom value Astart Aend Bstart Bend
chr1 0 0 54519752 17408 17431
chr1 0 0 54519752 17368 17391
chr1 0 0 54519752 567761 567783
chr11 0 2 93466832 568111 568133
chr11 0 2 93466832 568149 568171
chr11 0 2 93466832 1880734 1880756
chr11 4 93466844 93466880 93466856 93466878
chr11 2 93466885 135006516 93466889 93466911
chr11 2 93466885 135006516 94199710 94199732
Обратите внимание, что один и тот же интервал может появляться несколько раз, например, интервал (B) будет сообщаться два раза, если он перекрывается с двумя (A) интервалами:
Astart(1)=========================Aend1 Astart(2)========================Aend(2)
Bstart(1)=======================================Bend(1)
chrom value Astart Aend Bstart Bend
chr1 0 0 25 15 35 #A(1) and B(1) overlap
chr1 1 28 45 15 35 #A(2) and B(1) overlap
Аналогичным образом, интервал (A) будет сообщаться два или более раз, если он перекрывается с двумя или более интервалами (B):
Astart(3)===================================================================Aend(3)
Bstart(2)=========Bend(2) Bstart(3)===========Bend(3) Bstart(4)===============Bend(4)
chrom value Astart Aend Bstart Bend
chr4 0 10 100 15 25 #A(3) and B(2) overlap
chr4 0 10 100 30 75 #A(3) and B(3) overlap
chr4 3 10 100 80 120 #A(3) and B(4) overlap
Моя цель - вывести все отдельные позиции из интервалов (B) и соответствующие значения из (A). У меня есть фрагмент кода, который красиво выводит все соответствующие позиции в (B):
position <- unlist(mapply(seq, ans$Bstart, ans$Bend - 1))
> head(position)
[1] 17408 17409 17410 17411 17412 17413
Проблема в том, что недостаточно получить информацию о хромосомах оттуда. Мне нужно проверить информацию о хромосоме И положение одновременно, когда я перечисляю эти позиции. Это потому, что одно и то же целое число позиции может встречаться на нескольких хромосомах, поэтому я не могу впоследствии просто запустить что-то вроде for position %in% range(Astart, Aend) output $chrom, $value
(фиктивный код).
Как я могу одновременно получить (chrom, position, value)
?
Ожидаемый результат будет примерно таким:
> head(expected_result)
chrom position value
chr1 17408 0
chr1 17409 0
chr1 17410 0
chr1 17411 0
chr1 17412 0
chr1 17413 0
#skipping some lines to show another part of the dataframe
chr11 93466856 4
chr11 93466857 4