2012-04-13 3 views
2

基本的に私はこれらのファイルを持っています(NCBIのmedline)。それぞれはジャーナルタイトルに関連付けられています。それぞれには、0,1またはそれ以上のジェンバンク識別番号(GBID)があります。ファイルごとのGBIDの数を各ジャーナル名に関連付けることができます。私の問題は、同じジャーナルに複数のファイルが関連付けられている可能性があり、1ファイルあたりのGBIDの数をジャーナルあたりのGBIDの合計数に追加する方法がわかりません。ハッシュでは、上書きするのではなく、同じキーに2つの値をどのように追加しますか?

現在のコード: jtは、ジャーナルのタイトルを表し、ファイルから適切に抜き出しています。発生したカウントにGBIDが追加されます。

...これまでのところ、最初の検索が実行され、各 "pmid"は を1つのファイルとして考えることができるため、各 "フェッチ"は一度に1つずつすべてのファイルを処理します。

pmid_list.each do |pmid| 

    ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line| 

    if pmid_line =~ /JT.+- (.+)\n/ 
     jt = $1 
     jt_count = 0 
     jt_hash[jt] = jt_count 

     ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line_2| 

      if pmid_line_2 =~ /SI.+- GENBANK\/(.+)\n/ 
       gbid = $1 
       jt_count += 1 
       gbid_hash["#{gbid}\n"] = nil 
      end 
     end 

     if jt_count > 0 
      puts "#{jt} = #{jt_count}" 

     end 
    end 
    end 
end 

マイ結果:基本的に

Your search returned 192 results. 
Virology journal = 8 
Archives of virology = 9 
Virus research = 1 
Archives of virology = 6 
Virology = 1 

、どのように私はそれがウイルス学= 15のアーカイブを言ってもらうが、どの雑誌のタイトルのためですか?私はハッシュを試みましたが、ウイルス学の2番目のアーカイブは最初に上書きされました.2つのキーにハッシュ値を追加する方法はありますか?

全コード:上部に

#!/usr/local/bin/ruby 

require 'rubygems' 
require 'bio' 


Bio::NCBI.default_email = '[email protected]' 

ncbi_search = Bio::NCBI::REST::ESearch.new 
ncbi_fetch = Bio::NCBI::REST::EFetch.new 


print "\nQuery?\s" 

query_phrase = gets.chomp 

"\nYou said \"#{query_phrase}\". Searching, please wait..." 

pmid_list = ncbi_search.search("pubmed", "#{query_phrase}", 0) 

puts "\nYour search returned #{pmid_list.count} results." 

if pmid_list.count > 200 
puts "\nToo big." 
exit 
end 

gbid_hash = Hash.new 
jt_hash = Hash.new(0) 


pmid_list.each do |pmid| 

ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line| 

    if pmid_line =~ /JT.+- (.+)\n/ 
     jt = $1 
     jt_count = 0 
     jt_hash[jt] = jt_count 

     ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line_2| 

      if pmid_line_2 =~ /SI.+- GENBANK\/(.+)\n/ 
       gbid = $1 
       jt_count += 1 
       gbid_hash["#{gbid}\n"] = nil 
      end 
     end 

     if jt_count > 0 
      puts "#{jt} = #{jt_count}" 

     end 
     jt_hash[jt] += jt_count 
    end 
end 
end 


jt_hash.each do |key,value| 
# if value > 0 
    puts "Journal: #{key} has #{value} entries associtated with it. " 
# end 
end 

# gbid_file = File.open("temp_*.txt","r").each do |gbid_count| 
# puts gbid_count 
# end 
+0

申し訳ありませんが、rubyを使用して、biorubyの宝石で – kbearski

+0

私の答えと上記のコードを編集してもOKです。あなたはそうではないと言います。出力はどのように見えますか? 'Journal:... has ... entries ... 'という行だけが、すべての検索が完了した後に実行される唯一の' puts'なので – yamen

答えて

3

はどこかゼロので開始するjt_hashを宣言:

jt_hash = Hash.new(0)

その後、後:

puts "#{jt} = #{jt_count}"

入れ:

jt_hash[jt] += jt_count

jt_countはむしろ上書きよりも、ハッシュにインクリメントされるように、これはそれを作ります。それが起こるようにあなたのようなものを取得しますので、これは、すべてのものをプリントアウトします:

Your search returned 192 results. 
Virology journal = 8 
Archives of virology = 9 
Virus research = 1 
Archives of virology = 15 
Virology = 1 

あなたがちょうどいいjt_hashを経て、印刷します最後に何かを入れたら、すべてがちょうど印刷したい場合はすべてのもの:

jt_hash.each { |elem| 
    puts "#{elem[1]} = #{elem[0]}" 
} 
+0

ありがとう!それは理にかなっている! – kbearski

+0

実際、皮肉のようにこれはどうですか、私は実際に試したさまざまなやり方を振り返ってみると(0)が欠けていました。私の教授が何かを説明していないとき、私はそれが大好きです! – kbearski

+0

'Hash.new(0)'トリックは、実際にはほとんどの人が気づくより便利です。文字列のように変更可能なオブジェクトを使用する場合は、必ずブロックメソッドを使用してください。 'Hash.new( '')'や 'Hash.new([])'は驚きにつながります。 – tadman

関連する問題