欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

生信技能树-task1-人类基因组外显子区域长度

程序员文章站 2024-03-02 19:49:22
...

目标:统计人类基因组外显子区域长度

题目数据来源为:ftp://ftp.ncbi.nlm.nih.gov/pub/CCDS/current_human/CCDS.current.txt

perl

open F,"CCDS.current.txt";
while(<F>){#一行一行读取数据
  next if /^#/;#pass掉带#符号开头的行,即首行
  chomp;#去掉末尾的换行符
  @arr=split /\t/;#以制表符切割读取的每一行数据
  next unless /\[(.*?)\]/;#无外显子坐标的行pass
  @start_end=split /,\s+/,$1;#切割文件的第10列
  foreach(@start_end){
    @loci=split /-/;#以“-”切割每个外显子
    foreach(@loci[0][email protected][1]){$hash{"$arr[0]:$_"}=1;}#以染色体:坐标符号 格式存入perl哈希中,目的去重
  }
}
close F;

$length=keys %hash;#得到哈希键值长度
print "外显子总长度:$length\n";

输出结果

外显子总长度:35185772

用时  0m39.897s


python3 

import re

chr_pos = set()#定义set数据,目的去重
with open("CCDS.current.txt", 'r') as file:
    for line in file:
        if re.match('^#',line): 
            continue #跳过首行
        line = line.split("\t")
        if line[9] != "-":#pass掉第10列为"-"的数据行
            chr = line[0] #获得该行数据的染色体编号
            exons = line[9].lstrip("[").rstrip("]").split(", ") #去掉字符串[],以", "切割字符串,得到exons列表
            for exon in exons:#对切割得到的exons列表进行循环
                exon=exon.split("-")
                for i in range(int(exon[0]),int(exon[1])+1):
                    chr_pos.add(line[0]+":"+str(i))#依据染色体号:外显子坐标,利用set数据去重

print(len(chr_pos))

输出结果:

35185772

用时 0m43.192s

R语言 

if(T){
t1 <- Sys.time()#把程序运行之前的时间赋值给t1
data <- read.table("CCDS.current.txt", sep='\t')[c(1,10)]
get_gene <-function(data_item){
  # 目的就是去掉第10列的外面的中括号"[]"
  # 用到的数据data_item[2]为:[1013573-1013575, 1013983-1014477],输出的数据为"1013573-1013575, 1013983-1014477"
  #data_item=substr(data_item[2], 2, nchar(data_item[2])-1)
  data_item=sub("\\[(.*?)\\]", "\\1",data_item[2])
  data_item #返回值
}

get_length <- function(exon){
  # 输入的数据为'111-113'
  # 输出结果为c(111:113),即c(111,112,113)
  loc <- strsplit(exon,"-")[[1]] # 注:strsplit的输出结果为列表
  a <- c(loc[1]:loc[2])
  a
}

exon_length = NULL
chrs <- unique(data[,1])#得到染色体编号:1-23,X,Y
for (i in chrs){
  # paste 函数把i号染色体的所有外显子的坐标合并为一个character对象
  # gene的格式为'111-112, 115-135, 125-138, 254-258,...'
  gene <- paste(apply(data[which(data[1]==i & data[2] != '-'),], 1, get_gene),collapse=', ')#apply函数,1表示按行依次用get_gene函数处理
  # exon的格式为c('111-112','115-135', '125-138', '254-258', ...)
  exon <- unique(strsplit(gene,", ")[[1]]) # 输入的数据为c('111-112, 115-135, 125-138, 254-258,...');输出的数据为c('111-112','115-135', '125-138', '254-258', ...)
  exon_length <-  c(exon_length,length(unique(unlist(lapply(exon, get_length))))) # 输入的数据为lapply(c('111-112','115-135', '125-138', '254-258', ...),fun)
  #lapply的输出结果为列表,unlist则把列表变为向量,unique的目的是去重复计算的坐标,length计算该染色体的所有外显子坐标长度,一个坐标对应长度1,所以length得到的就是该染色体的外显子总长度
  #c(exon_length,....),累计所有已经计算过的染色体外显子长度
}

barplot(exon_length,names.arg=chrs,xlab='Chromosomes',ylab='length of exons',col = rainbow( length( chrs )) ) #绘制条形图
print(paste('The length of all exons is',sum(exon_length)))
difftime(Sys.time(), t1, units = 'secs')# 计算执行完成后时间与t1的间隔
}
"The length of all exons is 35185772"
Time difference of 6.63437 secs

 参考

https://mp.weixin.qq.com/s/xS-h0TQnCwjvgcRA7Ru3NQ

相关标签: 生物信息学