我还有另一个数据处理问题。所以我有这个制表符分隔数据的 .gtf 文件,我需要提取某些特征。这在我只需要为每个基因中的每个“外显子”类型提取基因 ID、POS1 和 POS2 之前就更简单了。我需要做同样的事情,但是我首先需要找到每个外显子相对于其在基因中的位置的 POS1 和 POS2。现在,POS1 和 POS2 列是根据 TYPE 在整个基因组上的位置进行编号的(这就是数字如此之高的原因)。还有另一个问题,如果链是-,则相反。如果您查看 PITG_00002,您会发现终止密码子似乎位于起始密码子之前。这是因为所有内容都相对于 +(模板)链进行编号。因此,这是数据表的示例:
GENE ID TYPE POS1 POS2 STRAND
PITG_00003 start_codon 38775 38777 + 0
PITG_00003 stop_codon 39069 39071 + 0
PITG_00003 exon 38775 39071 + .
PITG_00003 CDS 38775 39068 + 0
PITG_00004 start_codon 39526 39528 + 0
PITG_00004 stop_codon 41492 41494 + 0
PITG_00004 exon 39526 40416 + .
PITG_00004 CDS 39526 40416 + 0
PITG_00004 exon 40486 40771 + .
PITG_00004 CDS 40486 40771 + 0
PITG_00004 exon 40827 41494 + .
PITG_00004 CDS 40827 41491 + 2
PITG_00002 start_codon 10520 10522 - 0
PITG_00002 stop_codon 10097 10099 - 0
PITG_00002 exon 10474 10522 - .
PITG_00002 CDS 10474 10522 - 0
PITG_00002 exon 10171 10433 - .
PITG_00002 CDS 10171 10433 - 2
PITG_00002 exon 10097 10114 - .
PITG_00002 CDS 10100 10114 - 0
因此,对于每个基因,我需要相对于“起始密码子”类型的位置从 1 开始数字。不幸的是,STRAND 上列出的基因的数字是倒数的(例如,PITG_00002)。所以对于这些情况,编号需要从相对于 start_codon 的 POS2 的 1 开始,并在外显子的 POS1 结束。
所以对于每个外显子,我需要得到一个新的 POS1 和 POS2,我将它们称为 POSA 和 POSB。
要获得每个外显子的 POSA,我会这样做:
POS1 of "exon" - POS1 of "start_codon" + 1 = POSA
要获得每个外显子的 POSB,我会这样做:
POS2 of "exon" - POS1 of "start_codon" + 1 = POSB
以 PITG_00004 为例:
POSA = 39526-39526 + 1 = 1
POSB = 40416 - 39526 + 1 = 891
然后对每个基因中的每个外显子做同样的事情,使用该基因的 start_codon 位置来重置编号。除了负链的情况外,在这种情况下我必须这样做:
要获得每个外显子的 POSA,我会这样做:
POS2 of "start_codon" - POS2 of "exon" + 1 = POSA
要获得每个外显子的 POSB,我会这样做:
POS1 of "start_codon" - POS1 of "exon" + 1 = POSB
最终我想得到这个:
PITG_00002 exon 1 49
PITG_00002 exon 90 352
PITG_00002 exon 409 426
PITG_00003 exon 1 297
PITG_00004 exon 1 891
PITG_00004 exon 961 1246
PITG_00004 exon 1302 1969
我不确定如何为 + 链执行此操作,而为 - 链执行另一种方式。我最近更经常使用 python,但我也可以使用 perl。