比较 Ruby 中的多个值
Compare multiple values in Ruby
查找文件中每个基因的最长转录本的最佳方法是什么?
我有一个包含以下内容的文件:
Gene Transcript Transcript's size
NONDMEG000107 NONDMET000231 329
NONDMEG000107 NONDMET000234 21
NONDMEG000107 NONDMET000235 131
NONDMEG000107 NONHSAT000018 283
NONHSAG000008 NONHSAT000019 322
NONHSAG000008 NONHSAT000020 1300
NONHSAG000008 NONHSAT000021 971
NONHSAG000008 NONHSAT000022 277
NONHSAG000008 NONHSAT000043 335
NONHSAG000008 NONHSAT000044 179
输出应该是:
NONDMEG000107 NONDMET000231 329
NONHSAG000008 NONHSAT000020 1300
不清楚那里有什么数据类型,但假设每个条目都是一个 gen(string)、transcript(string) 和 size(integer) 的数组:
data = [
['NONDMEG000107', 'some transcript', 10],
['NONDMEG000107', 'some transcript', 3229],
['NONDMEG000107', 'some transcript', 312],
['NONDMEG000107', 'some transcript', 144],
['NONHSAG000008', 'some transcript', 1],
['NONHSAG000008', 'some transcript', 345],
['NONHSAG000008', 'some transcript', 100],
['NONHSAG000008', 'some transcript', 324]
]
data.group_by(&:first).map{|_,v| v.max_by(&:last)}
#=> [["NONDMEG000107", "some transcript", 3229], ["NONHSAG000008", "some transcript", 345]]
您可以将文件读取为 CSV
,然后检查每一行并找出哪个基因具有最大转录大小。输入文件需要更改一处,文件头应为
Gene Transcript Transcript_size
代码如下:
require "csv"
require "pp"
hash = {}
CSV.foreach("/path/to/gene_data_file", :col_sep => " ", :headers => :first_row) do |row|
hash[row["Gene"]] = {} if not hash[row["Gene"]]
hash[row["Gene"]]["Transcript"] = "" if not hash[row["Gene"]]["Transcript"]
hash[row["Gene"]]["Transcript_size"] = 0 if not hash[row["Gene"]]["Transcript_size"]
if row["Transcript_size"].to_i > hash[row["Gene"]]["Transcript_size"]
hash[row["Gene"]]["Transcript"] = row["Transcript"]
hash[row["Gene"]]["Transcript_size"] = row["Transcript_size"].to_i
end
end
pp hash
#=> {"NONDMEG000107"=>{"Transcript"=>"NONDMET000231", "Transcript_size"=>329},
# "NONHSAG000008"=>{"Transcript"=>"NONHSAT000020", "Transcript_size"=>1300}}
查找文件中每个基因的最长转录本的最佳方法是什么?
我有一个包含以下内容的文件:
Gene Transcript Transcript's size
NONDMEG000107 NONDMET000231 329
NONDMEG000107 NONDMET000234 21
NONDMEG000107 NONDMET000235 131
NONDMEG000107 NONHSAT000018 283
NONHSAG000008 NONHSAT000019 322
NONHSAG000008 NONHSAT000020 1300
NONHSAG000008 NONHSAT000021 971
NONHSAG000008 NONHSAT000022 277
NONHSAG000008 NONHSAT000043 335
NONHSAG000008 NONHSAT000044 179
输出应该是:
NONDMEG000107 NONDMET000231 329
NONHSAG000008 NONHSAT000020 1300
不清楚那里有什么数据类型,但假设每个条目都是一个 gen(string)、transcript(string) 和 size(integer) 的数组:
data = [
['NONDMEG000107', 'some transcript', 10],
['NONDMEG000107', 'some transcript', 3229],
['NONDMEG000107', 'some transcript', 312],
['NONDMEG000107', 'some transcript', 144],
['NONHSAG000008', 'some transcript', 1],
['NONHSAG000008', 'some transcript', 345],
['NONHSAG000008', 'some transcript', 100],
['NONHSAG000008', 'some transcript', 324]
]
data.group_by(&:first).map{|_,v| v.max_by(&:last)}
#=> [["NONDMEG000107", "some transcript", 3229], ["NONHSAG000008", "some transcript", 345]]
您可以将文件读取为 CSV
,然后检查每一行并找出哪个基因具有最大转录大小。输入文件需要更改一处,文件头应为
Gene Transcript Transcript_size
代码如下:
require "csv"
require "pp"
hash = {}
CSV.foreach("/path/to/gene_data_file", :col_sep => " ", :headers => :first_row) do |row|
hash[row["Gene"]] = {} if not hash[row["Gene"]]
hash[row["Gene"]]["Transcript"] = "" if not hash[row["Gene"]]["Transcript"]
hash[row["Gene"]]["Transcript_size"] = 0 if not hash[row["Gene"]]["Transcript_size"]
if row["Transcript_size"].to_i > hash[row["Gene"]]["Transcript_size"]
hash[row["Gene"]]["Transcript"] = row["Transcript"]
hash[row["Gene"]]["Transcript_size"] = row["Transcript_size"].to_i
end
end
pp hash
#=> {"NONDMEG000107"=>{"Transcript"=>"NONDMET000231", "Transcript_size"=>329},
# "NONHSAG000008"=>{"Transcript"=>"NONHSAT000020", "Transcript_size"=>1300}}