¿Cuál es la mejor manera de encontrar la transcripción más larga de cada gen en un archivo?

Tengo un archivo con el siguiente contenido:

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

La salida debe ser:

NONDMEG000107   NONDMET000231   329    
NONHSAG000008   NONHSAT000020   1300
-2
Michele 25 ene. 2016 a las 17:56

2 respuestas

La mejor respuesta

No está claro qué tipos de datos hay, pero asumiendo que cada entrada es una matriz de gen (cadena), transcripción (cadena) y tamaño (entero):

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]]
3
Andrey Deineko 25 ene. 2016 a las 16:19

Puede leer el archivo como CSV y luego inspeccionar cada fila y averiguar qué gen tiene el tamaño máximo de transcripción. Hay un cambio necesario en el archivo de entrada, el encabezado debe ser

Gene            Transcript      Transcript_size

Aquí está el código:

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}}
0
Wand Maker 25 ene. 2016 a las 16:28