美文网首页
根据FASTA的ID重新排序并拆分数据

根据FASTA的ID重新排序并拆分数据

作者: Shaoqian_Ma | 来源:发表于2020-04-04 14:50 被阅读0次

生信练习题

参考:
https://mp.weixin.qq.com/s/loKVJJPxGyRWYOF3pYDOdw

在公众号上看到了大神用c实现的一个操作,我尝试了用R,数据结构是list,同时细化了一下其他操作,比如排序,指定输出等;我的思路是先提取id,把list按id分割,然后计算每个id对应chr的长度,再提取list里的元素

作为新手,我对写代码不是很熟,高手勿喷

rm(list=ls())

#输入文件
con0 <- file("test.faa","r")
all_test<- readLines(con0,n=-1)
#length(all_test)

#提取所有id:
id = list()
sum = 0 
for (i in 1:length(all_test)) {
  if(strsplit(all_test[i],split = "")[[1]][1] == ">"){
    sum = sum + 1
     id[[sum]] <- all_test[i]
  }
}
id <- unlist(id)
close(con0)

if(file.exists("id.txt") == F){
  write(id,file = "id.txt")
}
   

#匹配id和在text里的位置
pos<- match(id, all_test)
# length(pos)
#1295

con0 <- file("test.faa","r")
#如果是按id号分割:可先测试一下1:5,并write
tex = list()
for(i in 1:(length(pos)-1)){
  tex[[i]] = readLines(con0,n=(pos[i+1]-pos[i]))
  if (i == (length(pos)-1)){
    tex[[i+1]] <- readLines(con0,n=-1)
  }#不要忘记添加最后一行
  #write(tex,file = paste("tes",i,".txt"))
}
close(con0)
#目的是将读取的字符串变成list
# tex[[1295]][1]

#怎么对tex排序?
tail(id)
id2<- sort(id)#排序
tex2 <- list()#创建一个新的list用来存放排序后的tex
for(i in 1:length(id2)){
  for(j in 1:length(tex)){
  if(tex[[j]][1] == id2[i]){
    tex2[[i]] <- tex[[j]]
  }
}
  }
# tex2[[1]]
# id2

if(file.exists("sorted.txt") == F){
  write(unlist(tex2),file = "sorted.txt")
}


#测试
subset(tex2,tex2[1:unlist(t)])

#下面的方法可以计算出有多少个chr1的片段
t<- lapply(lapply(tex2, function(x){grep(strsplit(x,split = ":")[[1]][1],
                                            pattern = paste(">chr",1,sep = ""))}),
              function(x){ifelse(x == 0, FALSE, TRUE)})


#这样就可以把每个单独的染色体序列写入一个list了
chr1 <- list()
for(i in 1:length(unlist(t))){
  chr1[[i]] <- tex2[[i]]
}

#接下来的问题是,把上面的步骤包装成函数,一步写出文件
#获取每条染色体的行数(一共7条,chr1-chr7),然后放到函数里面,输出全部染色体
pos2 <- list()
#step1:获取每个chr的len
for(eachchr in seq(1,7)){
  t <- unlist(lapply(lapply(tex2, function(x){grep(strsplit(x,split = ":")[[1]][1],
                                                   pattern = paste(">chr",eachchr,sep = ""))}),
                     function(x){ifelse(x == 0, FALSE, TRUE)}))
  pos2[eachchr] <- length(t)#储存每个片段的长度
  
}
#step2:利用len取出每条染色体
CountChr2 <- function(tex = tex2,chr=chr){
  for(eachchr in chr){
    t <- unlist(lapply(lapply(tex, function(x){grep(strsplit(x,split = ":")[[1]][1],
                                                     pattern = paste(">chr",eachchr,sep = ""))}),
                       function(x){ifelse(x == 0, FALSE, TRUE)}))
    pos2[eachchr] <- length(t)#储存每个片段的长度
    
  }
  fil <- list()
  for(eachchr in chr){
    if(eachchr == 1){#分支
      fil[[1]] <- unlist(tex[1:pos2[[eachchr]]])
      write(fil[[eachchr]],file = paste("chr",eachchr,".txt",sep = ""))                    
    }
    else{
      fil[[eachchr]] <- unlist(tex[(pos2[[eachchr-1]]+1):((pos2[[eachchr-1]]+1) + pos2[[eachchr]]-1)])
      pos2[[eachchr]]<- pos2[[eachchr-1]]+1 + pos2[[eachchr]]-1#比如从chr1-chr2,为了计算每次要从tex中提取多少行对应的chr,比如485-690,迭代时需要累加上已经提取的行数
      write(fil[[eachchr]],file = paste("chr",eachchr,".txt",sep = ""))#这里可以设置一个条件判断,只输出指定的chr
    }
  }
}
#测试
CountChr2(tex = tex2,chr = seq(1,7))

#指定染色体输出------------------------------------------------------------------------
##参数说明:tex为排序好的chr_list,chr为完整的染色体数(写成向量),
#cfile为指定分割出的染色体,比如c(3,4)
CountChr3 <- function(tex = tex2,chr=chr,cfile = c()){
  for(eachchr in chr){
    t <- unlist(lapply(lapply(tex, function(x){grep(strsplit(x,split = ":")[[1]][1],
                                                    pattern = paste(">chr",eachchr,sep = ""))}),
                       function(x){ifelse(x == 0, FALSE, TRUE)}))
    pos2[eachchr] <- length(t)#储存每个片段的长度
    
  }
  fil <- list()
  for(eachchr in chr){
    if(eachchr == 1){
      fil[[1]] <- unlist(tex[1:pos2[[eachchr]]])
      if(eachchr %in% cfile){
        write(fil[[eachchr]],file = paste("chr",eachchr,".txt",sep = ""))
      }                   
    }
    else{
      fil[[eachchr]] <- unlist(tex[(pos2[[eachchr-1]]+1):((pos2[[eachchr-1]]+1) + pos2[[eachchr]]-1)])
      pos2[[eachchr]]<- pos2[[eachchr-1]]+1 + pos2[[eachchr]]-1
      if(eachchr %in% cfile){
        write(fil[[eachchr]],file = paste("chr",eachchr,".txt",sep = ""))
      }
      #这里可以设置一个条件判断,只输出指定的chr
    }
  }
}

#测试
CountChr2(tex = tex2,chr = seq(1,7),cfile = c(3,5))                                                                             

相关文章

网友评论

      本文标题:根据FASTA的ID重新排序并拆分数据

      本文链接:https://www.haomeiwen.com/subject/rnljphtx.html