2014-02-09 44 views
0

我有一個巨大的數據框df,其中包括重疊間隔(A)和(B)以及它們所在的染色體(染色體)的信息。還有關於區間(A)觀察到的值(基因表達水平)的信息。R - 從幾列中檢索特定信息

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 

回答

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) 
+0

感謝您結束了48小時的挫折! :D – biohazard

+0

你知道我怎樣才能避免在「」之間獲得所有輸出值? – biohazard

+0

@biohazard只需將所有內容包裝在'as.data.frame'中即可。 – tchakravarty