按长度重新排列FASTA格式文件中的序列?

时间:2013-08-12 15:52:26

标签: ruby sorting bioinformatics sequences fasta

应该使用什么样的算法将FASTA序列重新排列成长度顺序(最短的第一个)? 它需要按顺序对序列进行排序,但显示所有信息,而不仅仅是长度。

我可以使用Bio::FastaFormat#length对序列的'长度'进行排序,将长度放入数组中,然后排序:

require 'rubygems'
require 'bio'

file = Bio::FastaFormat.open(ARGV.shift)
seqarray = []
file.each do |seq|
  a = seq.length
  seqarray.push a
end

puts seqarray.sort

按顺序显示序列长度,但我需要能够看到的是原始的FASTA格式,按长度顺序排列。

我无法将seq.length(每个序列的长度)添加到seq.entry(整个fasta格式)然后排序,因为seq.length是一个整数而seq.entry给出字符串。我尝试转换seq.length.to_s,将其添加到seq.entry,然后排序。这是我最接近的,不幸的是,长度是一个字符串,所以他们订购1,11,111而不是1,2,3等。

require 'rubygems'
require 'bio'

file = Bio::FastaFormat.open(ARGV.shift)
seqarray = []
file.each do |seq|
  a = (seq.length).to_s + ' = length' + seq.entry
  seqarray.push a
end
puts seqarray.sort

执行此操作后,我尝试使用sequence_id代替整个条目,而不是将长度转换为字符串,但id中有字母,所以我无法添加长度整数而不会收到错误消息。

所以是的,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为你可以使用“how to sort a ruby array of strings by length”。

使用链接中描述的lambda将数组映射到新数组。

像这样:

require 'rubygems'
require 'bio'

file = Bio::FastaFormat.open(ARGV.shift)
seqarray = []
file.each do |seq|
    seqarray.push seq
end

puts seqarray.sort_by {|x| x.length}