• Publicidad

Sumar valores de un hash

Perl aplicado a la bioinformática

Sumar valores de un hash

Notapor alexander2714 » 2011-08-31 12:02 @543

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Bio::SeqIO;
  2.  
  3.   sub conteo_palabras_genoma_completo
  4. {
  5.     my ($infile,$out_intergenic_file,$min_intergenic_size,$max_intergenic_size) = @_;
  6.     my ($n_of_intergenic,$gi,$start,$end,$length,$strand,$taxon) = (0);
  7. #    print "ingrese el nombre del archivo:\n";
  8.  #   $infile=<STDIN>;
  9.   #  chop($infile);
  10.     my $in = new Bio::SeqIO(-file => "NC_002755.gb", -format => 'genbank');
  11.     open(SALIDA,">conteo_genoma_completo.txt");
  12.     open(LIDER,">lider.FASTA");
  13.     open(COMPLEMENTARIA,">complementaria.FASTA");
  14.     while( my $seq = $in->next_seq) # scan all sequences found in $input
  15.     {
  16.         my ($gbaccession,$sequence,$gen,@genes) = ( $seq->accession() );
  17.       $sequence = $seq->primary_seq()->seq() ||
  18.           'no encuentro la secuencia primaria, necesito un fichero GenBank completo!';
  19.         $taxon = '';
  20.  
  21.       for my $f ($seq->get_SeqFeatures)
  22.       {
  23.         if($f->primary_tag =~ /CDS|rRNA|tRNA/) # campos de 'genes'
  24.         {
  25.             $gi = '';
  26.           if($f->has_tag('db_xref'))
  27.           {
  28.               my $crossrefs = join(',',sort $f->each_tag_value('db_xref'));
  29.             if($crossrefs =~ /(GI\:\d+)/){ $gi = $1 }
  30.           }
  31.           elsif($f->has_tag('locus_tag'))
  32.           {
  33.             if($gi eq '' && $f->has_tag('locus_tag'))
  34.             {
  35.               $gi = "ID:".join(',',sort $f->each_tag_value('locus_tag'));
  36.             }
  37.           }
  38.  
  39.           next if($gi eq '');
  40.  
  41.           $start = $f->start();
  42.           $end  = $f->end();
  43.           $strand = $f->location()->strand();
  44.           push(@genes,[$start,$end,$gi,$strand]);
  45.         }
  46.         elsif($f->primary_tag() =~ /source/)
  47.         {
  48.           if($f->has_tag('organism'))
  49.           {
  50.             foreach my $element ($f->each_tag_value('organism'))
  51.             {
  52.               $taxon .= "[$element],";
  53.             }
  54.             chop $taxon;
  55.           }
  56.         }
  57.       }
  58.         my %promotoras;
  59.         for($gen=1;$gen<scalar(@genes);$gen++)
  60.         {
  61.                       $n_of_intergenic++;
  62.                       $start = 0;
  63.                       $end ;
  64.                       $length = $end-$start;
  65.                       $molde=substr($sequence,$start,$length);
  66.                       print LIDER ">intergenic$n_of_intergenic|$gbaccession|coords:$start..$end|".
  67.                           "length:$length|($genes[$gen-1][3])".
  68.                           "|$taxon\n";
  69.                       print LIDER $molde."\n";
  70.  
  71.                       $promotoras{$gen}=$molde;
  72.  
  73.  
  74.                       $lider=substr($sequence,$start,$length);
  75.                       $revcom= reverse $lider;
  76.                       $revcom =~ tr/ACGTacgt/TGCAtgca/;
  77.                       $length = length($revcom);
  78.              
  79.                       print COMPLEMENTARIA ">intergenic$n_of_intergenic|$gbaccession|coords:$start..$end|".
  80.                           "length:$length|($genes[$gen-1][3])".
  81.                           "|$taxon\n$revcom\n";
  82.  
  83.                       $promotoras{$gen}=$revcom;
  84.  
  85.                       my %palabra;
  86.                       foreach my $id (keys %promotoras){
  87.                           $limite=length($promotoras{$id})-8+1;
  88.                           for($i=0;$i<$limite;$i++)
  89.                           {
  90.                               my $cadena=substr($promotoras{$id},$i,8);
  91.                               if (exists $palabra{$cadena}){
  92.                                   $palabra{$cadena}++;
  93.                               }
  94.                               else{
  95.                                   $palabra{$cadena}=1;
  96.                               }
  97.                           }
  98.                       }
  99.                       foreach my $elemento(sort {$palabra{$a} <=> $palabra{$b}} keys %palabra)
  100.                       {                          
  101.                           print SALIDA  "$elemento \t $palabra{$elemento}\n";
  102.            
  103.                       }
  104.         }
  105.        
  106.  
  107.     }
  108.  
  109.     close(FNA);
  110.  
  111.     return $n_of_intergenic;
  112. }
  113.  
  114. &conteo_palabras_genoma_completo;
  115.  
  116.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Hola, mira, en el código anterior tengo una salida de palabras que a su vez son contadas, quisiera poder hallar el promedio de mi salida pero para ello necesito sumar el conteo contenido en

$palabra{$elemento}

Dentro de ese valor hay una serie de números que deben ser sumados.

Un ejemplo de la salida del código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
palabra  conteo
atg              1
ctg              1
cat              2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y debo hacer esto (1+1+2)/3 = 1.3

La columna conteo está contenida en $palabra{$elemento}.

Y debe ser dividido por la cantidad de palabras que está en $elemento.

¿Cómo hago para sumar los conteos como lo expliqué anteriormente?
alexander2714
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-07-25 11:22 @515

Publicidad

Re: Sumar valores de un hash

Notapor explorer » 2011-08-31 14:13 @634

La suma la haces con una variable, que declaras antes del bucle. Dentro del bucle le vas agregando el valor del hash. Y después del bucle divides el valor que contenga la variable, por el valor scalar keys %palabra, que es el número de claves pintadas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sumar valores de un hash

Notapor alexander2714 » 2011-08-31 14:24 @642

Algo así elaboré pero me dio error ¿cuál es el problema?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $sum = 0;
  2.                       my $sum2 = 0;
  3.                       foreach my $elemento(sort {$palabra{$a} <=> $palabra{$b}} keys %palabra)
  4.                       {        
  5.                           $sum += $palabra{$elemento};
  6.                           $sum2+= $palabra{$elemento} * $palabra{$elemento};
  7.                           print SALIDA  "$elemento \t $palabra{$elemento}\n";
  8.                       }
  9.                       $prom = $sum/length($elemento);
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El error es:

Illegal division by zero at genoma_completo.pl line 108, <GEN0> line 155484.
alexander2714
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-07-25 11:22 @515

Re: Sumar valores de un hash

Notapor explorer » 2011-08-31 15:50 @701

Claro, porque $elemento, fuera del bucle, no tiene ningún valor, por lo que, por defecto, Perl lo toma como cero, y por eso sale un error de división por cero.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados