2

应该使用哪种算法将 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包含字母,因此我无法添加长度整数而不会收到错误消息。

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

4

1 回答 1

0

我认为您可以使用“如何按长度对字符串的红宝石数组进行排序”。

使用链接中描述的 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}
于 2013-08-12T15:59:18.133 回答