2013-07-02 75 views
0

這可能是一個非常簡單的問題,但我希望有人能夠爲我提供快速高效的答案......我試圖將染色體數據輸入到數據庫中有些改變格式。該數據目前看起來像:Python:通過多列值解析數據

chrom = chr1 
txStart = 134212702 
exonCount = 8 
exonStarts = 134212702,134221529,134222782,134224273,134224707,134226534,134227135,134227897, 
exonEnds= 134213049,134221650,134222806,134224425,134224773,134226654,134227268,134229870, 

我創建了所有上述數據,包括啓動子,外顯子和內含子的位置信息的數據庫。每組數據(來自單行的數據,如上面的樣本)將對應於單個轉錄本。我將啓動子定義爲txStart(例如134212702) - 2000.每個轉錄子都有一組外顯子,如外顯子數所指定的(ex.8)。較大轉錄本中每個外顯子的開始和結束由exonStarts和exonEnds列表中的匹配值指定。例如,在這種情況下,第一外顯子將範圍從134212702到134213049.內含子位於外顯子之間,使得第一外顯子會從134213050到134221528.我成功地做到了這一點做的:

PromoterStart = int(TxStart) - 2000 
PromoterEnd = int(TxStart) -1 
ExonStart = map(int, ExonStart[:-1].split(",")) 
ExonEnd = map(int, ExonEnd[:-1].split(",")) 
i = 0 
while i < int(ExonCount): 
    ExonCount = i +1 
    if i != int(ExonCount) -1: 
     IntronStart[i] = ExonEnd[i] +1 
     IntronEnd[i] = ExonStart[i+1] -1 
    i += 1 

使用這種方法然後我將所有數據插入數據庫以供以後比較。現在我想重新使用從TxStart -2000到TxStart + 2000的啓動子定義重新進行此分析。然而,似乎使用此代碼在外顯子和啓動子之間存在大量重疊並且僅將啓動子改變爲= int (TxStart)+2000,顯着降低了我的下游分析速度。我想找到一種方法,以便如果某個區域被認爲是從txStart -2000到txStart +2000的啓動子,則該區域不會被視爲外顯子區域。

+4

我看了你的問題兩次,我害怕被刪除我不知道你在問什麼。 :-(你能否在沒有所有遺傳學(?)專業詞彙的情況下重新構成模糊你想達到的目標? – Christoph

+1

是的,它是遺傳的東西,但我真的不明白你想達到什麼目的,我認爲我們需要知道你的數據庫格式是什麼,因爲我認爲你試圖包含前一個基因的數據???你能否圍繞你的問題的確切核心重新提出這個問題 – RickyA

+0

@RickyA:我試圖重新解釋和澄清我的問題。的數據對應於單個基因/轉錄本,幷包含我需要的所有信息用於分析。更具體地說,我正在查看更大區域的幾個較小部分。 – user2165857

回答

1

是這樣的嗎?

NewExonStart,NewExonEnd = zip(*filter(lambda y:not(y[0]>=PromoterStart and y[1]<=PromoterEnd),zip(ExonStart,ExonEnd))) 

您可以通過對ExonStart,ExonEnd拉鍊和丟棄可能PromoterStart,PromoterEnd之間ExonStart,ExonEnd謊言任何條目。然後unzipp壓縮的列表,以找回新的價值觀

>>> TxStart = 134212702 
>>> PromoterStart = int(TxStart) - 2000 
>>> PromoterEnd = int(TxStart) + 2000 
>>> PromoterStart 
134210702 
>>> PromoterEnd 
134214702 
>>> 
>>> ExonStart 
[134212702, 134221529, 134222782, 134224273, 134224707, 134226534, 134227135, 134227897] 
>>> ExonEnd 
[134213049, 134221650, 134222806, 134224425, 134224773, 134226654, 134227268, 134229870] 
>>> 
>>> NewExonStart,NewExonEnd = zip(*filter(lambda y:not(y[0]>=PromoterStart and y[1]<=PromoterEnd),zip(ExonStart,ExonEnd))) 
>>> 
>>> NewExonStart 
(134221529, 134222782, 134224273, 134224707, 134226534, 134227135, 134227897) 
>>> NewExonEnd 
(134221650, 134222806, 134224425, 134224773, 134226654, 134227268, 134229870) 

兩個ExonStartExonEnd的第一項因爲它位於PromoterStartPromoterEnd之間

+0

謝謝這真的很有幫助,但這仍然不能完全回答我的問題。在這種情況下,由於啓動子末端落在兩個外顯子之間,這將在第一個內含子內。我現在需要改變內含子開始,以便它只在啓動子結束後纔開始。或者,如果它屬於外顯子,我需要改變外顯子的起始位置,以便新的起始位置爲啓動子終點+1。 – user2165857

+0

如果你能夠展示幾個例子,它將有助於更好地理解問題。對Inron,Exon或Promoter也不熟悉,所以像'start','end'和'fall in'這樣的術語往往令人困惑 – RedBaron