0

df重複する間隔 (A) と (B) に関する情報と、それらが配置された染色体 (クロム) に関する情報を含む巨大なデータフレームがあります。間隔 (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) が 2 つの間隔 (A) と重なっている場合、間隔 (B) は 2 回報告されます。

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) が 2 つ以上の (B) 間隔と重複する場合、2 回以上報告されます。

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
4

1 に答える 1

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)
于 2014-02-09T10:01:10.807 に答える