||
我们在处理基因数据时候常常会遇到一些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/
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-4-24 14:51
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社