统计注释出的基因数目,基因长度,外显子和CDS长度

做完基因组注释后需要统计一下基因长度,CDS长度和intron以及exon长度。

1.首先统计基因数目,直接使用linux统计:

awk '$3 == "gene"' myannotation.gff | wc -l   ##统计注释文件中第三列为gene的行数,即为基因的数目

2.统计基因长度,使用tidyverse包

    2.1第一步先把gff文件转为gtf格式的注释

gffread myanno.gff -T -o myanno.gtf

    用此种方式转换来的gtf注释没有exon id,不利于后续统计exon长度,因此使用perl脚本另转换一次,转换后的gtf文件如下,有了exon id


perl gff3_to_gtf_phytozome_1nt_exon_Mgly.pl my.gff myexon.gff  ###for exon

perl 脚本来自导师,就不放啦,有需要可以私信(不知道这样行不行,思考ing)

2.2转换后使用R计算基因长度:

     我文件中的所有gene都转换成了transcript,gene_id在gtf中为transcript_id,先提取所有transcript,然后计算平均长度:

install.packages("tidyverse") ##加载包

library(tidyverse)

gtf<-rtracklayer::import("my.gtf")  ##读gtf文件

head(gtf)

table(gtf$type)

transcript<-gtf[gtf$type=="transcript",c("start", "end", "transcript_id")]  ##每个transcript对应原有的基因

length(unique(transcript$transcript_id))  ###数基因数目

glc = lapply(split(transcript,transcript$transcript_id),function(x){

  tmp=apply(x,1,function(y){

    y[1]:y[2]

  })

  length(unique(unlist(tmp)))

})   ###计算长度

glc=data.frame(transcript_id=names(glc),

              length=as.numeric(glc))

save(glc,file = "Mglytrans.Rdata")

load("Mglytrans.Rdata")

head(glc)   ###所有基因长度

mylen<-glc$length

mymean<-mean(mylen)   ##平均基因长度

mymean

2.2 计算平均CDS长度,这里是按照基因计算的,每个基因的CDS之和算是一个,因此是总CDS长度除以基因个数

gtf<-rtracklayer::import("my.gtf")

gtf<-as.data.frame(gtf);dim(gtf)

table(gtf$type)           ###exon CDS transcript

CDS<-gtf[gtf$type=="CDS",c("start", "end", "transcript_id")]   ##以基因为单位进行计算

length(unique(CDS$transcript_id))

glc = lapply(split(CDS,CDS$transcript_id),function(x){

  tmp=apply(x,1,function(y){

    y[1]:y[2]

  })

  length(unique(unlist(tmp)))

})

glc=data.frame(transcript_id=names(glc),

              length=as.numeric(glc))

save(glc,file = "glc.Rdata")

load("glc.Rdata")

head(glc)

mylen<-glc$length

meancds<-mean(mylen)

meancds

2.3 计算平均外显子长度,以每个外显子为单位,因此是exon总长度除以exon个数

class(gtf)  ###这里读入的是第二种方式转换的gtf

gtf<-as.data.frame(gtf);dim(gtf)

head(gtf)

table(gtf$type)

exon<-gtf[gtf$type=="exon",c("start", "end", "exon_id")]

length(unique(exon$exon_id))

glc = lapply(split(exon,exon$exon_id),function(x){

  tmp=apply(x,1,function(y){

    y[1]:y[2]

  })

  length(unique(unlist(tmp)))

})

glc=data.frame(exon_id=names(glc),

              length=as.numeric(glc))

save(glc,file = "exon.Rdata")

load("exon.Rdata")

head(glc)

mylen<-glc$length

mymean<-mean(mylen)

mymean

2.4 计算平均内含子长度,使用python脚本计算的:

def step1(infile):

    with open(infile, 'r') as f:

        allintron = 0

        id_exon = {}

        out_list = []

        sumlength = 0

        for line in f:

            lin = line.strip().split('\t')

            name = lin[8].split(';')[1].split('\"')[1]

            start = lin[3]

            end = lin[4]

            start_end = start + "\t" + end

            if name not in id_exon.keys():

                id_exon[name] = []

                id_exon[name].append(start)

                id_exon[name].append(end)

            else:

                id_exon[name].append(start)

                id_exon[name].append(end)

    for id in id_exon.keys():

        exon = id_exon[id]

        if len(exon) == 2:

            intron = 0

        else:

            enum = len(exon)

            print(enum, id)

            for i in range(0, enum, 2):

                if i == 0:

                    pass

                else:

                    #print(i)

                    allintron += 1

                    len_intron = int(exon[i]) - int(exon[i-1]) - 1

                    sumlength += len_intron

                    num_int = i/2

                    outline = id + "\t" + str(num_int) + "\t" + str(len_intron) + "\n"

                    out_list.append(outline)

                    print(outline)

    lastline = "average" + "\t" + str(sumlength/allintron) + "\n"

    out_list.append(lastline)

    return out_list

def write_out(list, outfile):

    with open(outfile, "w") as myout:

        for item in list:

            myout.write(item)

    myout.close()

intron_list = step1("Mgly.coding.gene_new_chr_new.gff")

write_out(intron_list, "Mgly_intron.txt")

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容