2013-07-02 38 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