2012-04-13 10 views
2

Grundsätzlich habe ich diese Dateien (Medline von NCBI). Jeder ist einem Zeitschriftentitel zugeordnet. Jeder hat 0, 1 oder mehr Genbankidentifikationsnummern (GBIDs). Ich kann die Anzahl der GBIDs pro Datei mit jedem Journalnamen verknüpfen. Mein Problem ist, dass ich mehr als eine Datei mit demselben Journal verknüpft habe, und ich weiß nicht, wie ich die Anzahl der GBIDs pro Datei zu einer Gesamtzahl von GBIDs pro Journal hinzufügen kann.Wie fügen Sie in einem Hash zwei Werte für denselben Schlüssel hinzu, anstatt sie zu überschreiben?

Mein aktueller Code: jt steht für Journal Titel, richtig aus der Datei gezogen. GBIDs werden zu der Zählung hinzugefügt, die aufgetreten ist.

... bis zu diesem Zeitpunkt die erste Suche durchgeführt wird, das jeweils „PMID“ kann man sich vorstellen als eine einzige Datei, so dass jeder „holen“ durchläuft alle Dateien einen nach dem anderen ...

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 

Mein Ergebnis:

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

Grundsätzlich wie bekomme ich es Archives of virology zu sagen = 15, sondern für jeden Titel der Zeitschrift? Ich habe einen Hash probiert, aber das zweite Archiv der Virologie überschrieb einfach das erste ... gibt es eine Möglichkeit, zwei Schlüssel dazu zu bringen, ihre Werte in einem Hash zu addieren?

Voll Code:

#!/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

Entschuldigung, mit Ruby, mit Bioruby Edelsteine ​​ – kbearski

+0

OK nach meiner Antwort und Ihre Bearbeitung der oben genannten Code sollte jetzt funktionieren. Du sagst es nicht. Wie sieht die Ausgabe aus? Und nur die Zeilen mit 'Journal: ... haben ... Einträge, die es assoziieren ', da dies das einzige' Puts 'ist, das ausgeführt wird, nachdem die Suche abgeschlossen ist. – yamen

Antwort

3

An der Spitze erklären irgendwo die jt_hash mit Nullen zu starten:

jt_hash = Hash.new(0)

Dann, nach:

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

Put:

jt_hash[jt] += jt_count

Das macht es so, dass jt_count in der Hash erhöht wird, anstatt überschrieben. Dies wird alles ausdrucken, wie es geschieht, so dass Sie so etwas wie bekommen:

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

Wenn Sie dann alles will nur einmal drucken, nur etwas am Ende wieder gutmachen, die durch jt_hash geht und druckt alles:

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

danke! Das macht Sinn! – kbearski

+0

Eigentlich, wie ist das für Ironie, ich habe wirklich nur die (0) vermisst, wenn ich auf die verschiedenen Möglichkeiten zurückblicke, die ich probiert habe. Ich liebe es, wenn mein Prof nichts erklärt! – kbearski

+0

Der 'Hash.new (0)' Trick ist tatsächlich viel nützlicher als die meisten Leute erkennen. Stellen Sie bei der Verwendung von Objekten, die wie Strings geändert werden können, sicher, dass Sie die Blockmethode verwenden. 'Hash.new ('')' oder 'Hash.new ([])' können zu Überraschungen führen. – tadman

Verwandte Themen