Página 1 de 1

Sumar los valores de abundancia de proteínas

NotaPublicado: 2018-05-22 06:29 @312
por 3mgcantarero
Hola.

Estoy intentando crear un script que me permita sumar los valores de abundancia (emPAI) de proteínas que pertenecen a un mismo género bacteriano.

El archivo de partida es un texto separado por tabuladores, de forma que la primera columna es el accesion number de la proteína, la segunda el valor a sumar (emPAI), la tercera el valor normalizado (nemPAI), la cuarta el Género y la quinta la familia.

He empezado con un hash pero no sé realmente que estoy sumando... ¿Alguna ayuda? Adjunto lo que llevo de script y un trozo de archivo de ejemplo.

Muchas gracias.

Mónica

Re: Sumar los valores de abundancia de proteínas

NotaPublicado: 2018-05-24 11:52 @536
por explorer
Dos cosillas...

Los números en la tabla vienen con coma (,), por lo que Perl no puede sumarlos, ya que Perl sigue (por defecto) la notación anglosajona de separar los decimales con punto (por cierto, en la última ortografía de la RAE (diciembre 2010) se aconseja usar esta notación).

Así que hay que hacer una breve transformación de comas a puntos.

Y la acumulación por género, pues para eso, acertadamente, usamos un hash, indexado por el género.

Lo que pasa es que no haces la acumulación mientras vas leyendo la tabla, cosa que sí puedes hacer como te pongo más abajo. Solo te faltaría hacer un bucle final -que sí tienes- para recorrer las claves y sacarlas al archivo resultado.

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;                                              # activa modo estricto y say()
  3.  
  4. my $archivo = 'BASAL_11 Families.txt';
  5.  
  6. my %generos;                                            # aquí haremos las sumas, por género
  7.  
  8. open my $IN,  '<', $archivo        or  die "No puedo leer [$archivo]: $!\n";
  9.  
  10. while (<$IN>) {
  11.     chomp;
  12.  
  13.     my($protein, $emPAI, $nemPAI, $genus, $family) = split /\t/;
  14.  
  15.     next if not $emPAI or $emPAI !~ /^[0-9.,]+$/;       # saltamos a la siguiente línea si no tenemos un número
  16.  
  17.     $emPAI =~ s/[,]/./;                                 # lo pasamos a notación de punto decimal
  18.     $emPAI += 0;                                        # nos aseguramos que es un número
  19.  
  20.     $generos{ $genus } += $emPAI;                       # acumulamos $emPAI segun el $genus al que pertenece
  21. }
  22.  
  23. close $IN;
  24.  
  25. #use Data::Dumper;
  26. #say Dumper \%generos;
  27.  
  28. open my $OUT, '>', 'Resultado.txt' or  die "No puedo escribir [Resultado.txt]: $!\n";
  29.  
  30. for my $genus (sort keys %generos) {
  31.     say $OUT "$genus $generos{$genus}";
  32. }
  33.  
  34. close $OUT;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Esta es la salida que obtengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Achromobacter 0.63
Acidaminococcus 1.27
Actinobacillus 0.21
Actinomyces 0.08
Aeromonas 0.14
Aggregatibacter 0.08
Akkermansia 0.23
Alistipes 4.03
Anaerococcus 0.32
Anaerofustis 2.17
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4