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

标签 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 中有字母,所以我无法在不收到错误消息的情况下添加到长度整数。

是的,有什么建议吗?

最佳答案

我想你可以使用“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}

关于ruby - 按长度重新排列 FASTA 格式文件中的序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18191388/

相关文章:

ruby-on-rails - ruby - ActiveRecord::ConnectionNotEstablished

javascript - Ruby on Rails AJAX 提交表单错误

mysql - Heroku 数据库 :push -> Missing Sequel gem

php - mysql php随机结果按名称排序

python - 如何强制在 Mac OsX.6 中为单个 shell session 使用 python 2.6_64bit?

python - 基于字符串输入Python导入变量替换矩阵

ruby-on-rails - 用户属性不会保存

linux - 按列和一般编号对床文件进行排序

c++ - AVL树实现c++

algorithm - 系统发育树比较