scybhmutpw的个人博客分享 http://blog.sciencenet.cn/u/scybhmutpw

博文

perl解决gene id与ensembl gene id以及geneid 与refseq id的转换

已有 17201 次阅读 2015-4-9 21:24 |系统分类:科研笔记| 如何, 生物信息, perl编写程序, ID转换, GENEID

我们在处理基因数据时候常常会遇到一些id转换的困难,虽然有很多id转换的工具,比如ENSEMBL的biomart,但是总的说来都不是很完美,最终觉得还是不如自己编写程序来匹配用得方便(因为自己写一些perl程序来作匹配可以更好的满足自己的特殊需求),但是我们又苦于去寻找这些id2id的文件,下面我主要以介绍GENE_ID转换为ENSEMBL_GENE_ID(或者是REFSEQ_ID)为例,介绍一下如何自己编写perl程序实现简单的数据匹配:

1、首先,我们需要得到id2id的一个文件,这样的数据一般可以从公共数据库中下载(只要是大型的数据库一般都会提供的),我就从NCBI下载了一个gene2ensembl的文本作为数据转换的例子,当然还有其他的一些数据转换文本你也可以去它的ftp站点下载。

2、我们将下好的文本文件用excel打开就可以看见里面有好几列数据,文本第一行一般就是介绍,比如这里的gene2ensembl第一列是物种,第二列是geneid,我们接下来要做的工作是将geneid转化为ensembl gene id。

3、程序代码如下:(主要思想是用hash,以geneid为key,以ensembl gene id 为 value,先把所有的geneid2ensembl gene id存到hash中,然后再写到我们需要转换的文本中)

#!/usr/bin/perl

open INPUT1, "geneid.txt" or die "$!";

open INPUT2, "gene2ensembl" or die "$!";

open OUTPUT, ">>geneid-1.txt" or die "$!";

my %diff;        #建立hash表,将geneid2ensembl分别以键值对存入diff中

while (<INPUT2>)

{

chomp;

@input2=split(/\t/,$_);

$GENID=$input2[1];  #geneid作为key

$ENSG=$input2[2];  #ensembl gene id作为value

if($GENID){  #判断key是否存在

if($diff{$GENID}){ #判断value是否已经存在,如果存在了就在原来的数据后面追加

if ($ENSG != $diff{$GENID}){

$diff{$GENID}.=";$ENSG";

}

}

else{

$diff{$GENID}.="$ENSG";#如果不存在就在新建一个键值对

}

}

}

while (<INPUT1>)

{

chomp;

@line=split(/\t/,$_);

$ID=$line[0];#被写入文本的geneid在第一列

splice(@line,0,0,$diff{$ID});#将geneid对应的ensembl gene id插入已知geneid的文本的第一列

$new=join("\t",@line);#将数组合成一个字符串写出

print OUTPUT "$newn";

}

close INPUT2;

close INPUT1;

close OUTPUT;

4、还有更多的id转换工具可以去公共数据库的ftp网站下载,比如ftp.ncbi.nlm.nih.gov/gene/




https://blog.sciencenet.cn/blog-1412534-881169.html

上一篇:perl提取fasta格式文件中的DNA序列
收藏 IP: 61.180.241.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 14:51

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部