R - получить конкретную информацию из нескольких столбцов

У меня есть огромный фрейм данных 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

person biohazard    schedule 09.02.2014    source источник


Ответы (1)


Вызов ddply мог бы быть более элегантным, но логика была бы такой же:

dfA = read.table(textConnection("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"), header = TRUE)


dfB = as.data.frame(do.call(rbind, 
        apply(dfA, MARGIN = 1,  FUN = function(x) {
          cbind(mapply(seq, 
                       as.numeric(x['Bstart']),
                       as.numeric(x['Bend']) - 1),
                x['chrom'], x['value'])
        }
        )))
lapply(dfB, typeof)
person tchakravarty    schedule 09.02.2014
comment
Спасибо, что положили конец 48 часам разочарования !! : D - person biohazard; 09.02.2014
comment
Вы знаете, как я могу избежать получения всех выходных значений между ними? - person biohazard; 09.02.2014
comment
@biohazard Просто оберните все это в as.data.frame. - person tchakravarty; 09.02.2014