• Publicidad

Obtener tabla consenso de varias tablas anteriores

Perl aplicado a la bioinformática

Obtener tabla consenso de varias tablas anteriores

Notapor akire » 2012-02-16 12:03 @544

¡¡¡Hola, qué tal, muy lindo día!!!

Tengo algo atorado este programa y necesito su ayuda. Lo que yo necesito es que a partir de unas tablas de entrada
como estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ENSMUSG00000000001      1488
ENSMUSG00000000028      203
ENSMUSG00000000049      3
ENSMUSG00000000056      192
ENSMUSG00000000058      199
ENSMUSG00000000078      912
ENSMUSG00000000085      150
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

quiero obtener una sola que contenga todos los genes (la primera columna) que correspondan a los archivos y a los que no se encuentren en uno u otro les pongo un 1. Hasta ahorita solo saca un archivo de cada uno duplicando valores y no los he relacionado. Agradecería mucho su apoyo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use lib "$ENV{'HOME'}/perl";
  3. use yo qw(:DEFAULT);
  4. use Data::Dumper;                      # Hint: print Dumper(\@cosa);
  5.  
  6. #use strict;
  7.  
  8. my @entrada_tbl = </data/uuab/adriana/*.tbl>;
  9. foreach my $file_tbl (@entrada_tbl) {
  10.  
  11.     open IN, $file_tbl or die "Cant read $file_tbl\n";
  12.  
  13.     open( OUT, ">$file_tbl.tbl1" );
  14.  
  15.     my ( %in, %exp );
  16.     while (<IN>) {
  17.         next unless /^EN/;
  18.         my ( $gen, $val ) = split;
  19.         $exp{$gen} = $val;
  20.         $exp{$val}++;
  21.         $in{$gen}++;
  22.  
  23.     }
  24.  
  25.     foreach my $gen ( sort keys %in ) {
  26.  
  27.         $exp{$gen} ||= 1;
  28.         $exp{$gen}++;
  29.  
  30.         print OUT "$gen\t$exp{$gen}\t$exp{$gen}\t$exp{$gen}\n";
  31.  
  32.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-02-16 12:13 @551, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Texto y Perl
akire
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-01-24 16:44 @739

Publicidad

Re: Obtener tabla consenso de varias tablas anteriores

Notapor explorer » 2012-02-16 12:43 @571

No me queda claro lo que hay que hacer...

Entiendo que quieras saber qué genes están en los archivos, pero, ¿qué quieres hacer con $exp{$val}++? Es decir, ¿qué significa y qué quieres hacer con los datos de la segunda columna?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener tabla consenso de varias tablas anteriores

Notapor akire » 2012-02-16 12:53 @578

Gracias por tu apoyo. Esa línea quería ver si con ello recorría los elementos junto con su valor por cada archivo
pero veo que solo lo hago por cada entrada, y lo que quiero hacer es juntarlo como en la tabla siguiente, donde por ejemplo, el gen ENSMUSG00000000028 está en el primer archivo con un valor de 106, en el segundo archivo está en 16 y en el último no estuvo, pero yo quiero que le ponga un 1.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ENSMUSG00000000001      1082    10      182
ENSMUSG00000000028      106     16      1
ENSMUSG00000000037      78      444     7
ENSMUSG00000000049      10      3       30
ENSMUSG00000000056      19      159     1597
ENSMUSG00000000058      247     247     247
ENSMUSG00000000078      687     1       1
ENSMUSG00000000085      93      3       1
ENSMUSG00000000088      7229    7       29
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Así es como yo necesito la salida :)
akire
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-01-24 16:44 @739

Re: Obtener tabla consenso de varias tablas anteriores

Notapor explorer » 2012-02-16 15:48 @700

No es tan sencillo...

No puedes sacar la información por cada línea, hasta que no hayas leído todas las líneas, porque no sabes cuántas columnas tienes.

Entonces... tienes que leer todos los archivos, y guardarlos en una estructura bidimensional, en donde las filas son cada gen, y cada columna, el número de archivo leído. Si un elemento no está definido, entonces sabemos que no fue leído, y le ponemos a '1'. Y lo mismo hay que hacer para las columnas finales, que también pueden haber estado vacías.

Esta es mi solución. Naturalmente, se puede hacer de muchas otras maneras.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. #use strict;
  4. #use warnings;
  5. #use diagnostics;
  6.  
  7. use autodie;                    # es mejor morir que regresar con deshonor (proverbio Klingon)
  8.  
  9. my %matriz;                     # guardaremos la información aquí
  10. my $col = 0;                    # número de columnas por línea
  11.  
  12. for my $file_tbl (<*.tbl>) {
  13.  
  14.     open my $TBL, '<', $file_tbl;
  15.     while (<$TBL>) {
  16.         next unless /^EN/;
  17.         chomp;
  18.         my($gen, $value) = split;
  19.         $matriz{$gen}[$col] = $value;    # almacenamos el valor, en la fila $gen, y columna $c
  20.     }
  21.     close   $TBL;
  22.    
  23.     $col++;                              # siguiente columna
  24. }
  25.  
  26. for my $gen (sort keys %matriz) {        # impresión de los datos
  27.     print $gen;                          # nombre del gen
  28.  
  29.     for my $item (@{$matriz{$gen}}) {
  30.         $item //= 1;                     # si el elemento no está definido, lo ponemos a '1'
  31.         print "\t$item";
  32.     }
  33.  
  34.     for (@{$matriz{$gen}} .. $col-1) {
  35.         print "\t1";                     # resto de elementos de la fila, también a '1'
  36.     }
  37.  
  38.     print "\n";
  39. }
  40.  
  41. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí estamos usando el operador // (nuevo en Perl v5.10) para saber si una variable contiene un valor definido, o no.
Última edición por explorer el 2012-02-17 02:54 @162, editado 2 veces en total
Razón: Reducción de código
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener tabla consenso de varias tablas anteriores

Notapor akire » 2012-02-16 17:30 @771

Muchísimas gracias :D , tu ayuda es estupenda, ¡¡¡¡¡¡ten un día fabuloso!!!!!!
akire
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-01-24 16:44 @739


Volver a Bioinformática

¿Quién está conectado?

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

cron