Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Asignar valores guardados en un hash a otros datos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie May 09, 2007 5:51 am
Mang
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2007
Mensajes: 4
Asignar valores guardados en un hash a otros datos Responder citando

Hola compañeros perleros, me alegro de entrar en este foro y enviaros mi primer post. Soy novato en esto y acabo de empezar, pero espero que con el paso del tiempo y las ayudas de este foro pueda avanzar en la materia.

Os cuento, trabajo en bioinformática con análisis de secuencias biológicas y Perl y me ha surgido un problema. Pero antes de nada, para que veáis cómo son los datos que empleo os pongo este ejemplo:

Código:
Q P V L H L V A L N T P L S G G M R G I R G A D F Q C


donde cada letra de la secuencia correspondería, en este caso, a un aminoácido. En mi trabajo tengo que asignar a cada aminoácido de una secuencia un determinado valor numérico. Eso lo he hecho con un Hash (como cada aminoácido puede repetirse le he puesto un índice numérico según la posición de cada aminoácido) y hasta ahí, bien. El problema es que tengo que asignar esos valores a otra secuencia de aminoácidos diferente en un proceso de alineamiento en que se pueden perder aminoácidos en una y otra secuencia, con lo cual pierdo las "keys" del hash para asignar esos valores.

Por ejemplo, tengo las secuencias de partida A y B:

Código:
Secuencia A = VPIVNLKDEVLSQPGARI
Secuencia B = VPIVNLKDELLFSGSEGPLKPGARI


Cada secuencia la meto en un array diferente (@A y @B), y los valores que asigno a la secuencia A en otro array (@VALOR), de igual longitud que @A. Con los posición de cada aminoácido de @A puedo asignar a cada aminoácido del array @A el valor de @VALOR que corresponde en un hash %H, de esta manera:

Perl:
my $i=0;
do {

    $H{$i}=$VALOR[$i];
 
    $i++;
} until ($i==scalar@A);


Vale, el código podría escribirse mejor, pero bueno, estoy aprendiendo Wink

En fin, al alinear ambas secuencias A y B me queda esto (es un ejemplo):

Código:
Secuencia A resultante= IVNLKDQPGARI
Secuencia B resultante= IVNLKDKPGARI


Como veis, en el proceso he perdido aminoácidos de la secuencia A y la B. Partiendo de los valores del Hash para los aminoácidos de la secuencia A que queden, ¿Cómo podría asignar los valores del hash %H que correspondan a la secuencia B?

Espero que hayáis entendido el problema, si no es así decidlo y os lo aclaro.

Muchas gracias por anticipado.
Wink
Mensaje Mie May 09, 2007 5:38 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Perl:
my $i=0;
do {

    $H{$i}=$VALOR[$i];
 
    $i++;
} until ($i==scalar@A);


Está bien, pero yo lo haría así:

Perl:
for(my $i = 0; $i <= $#A; $i++){
  $H{$i} = $VALOR[$i]
}


Creo que la evaluación de for es mejor para este caso que until pero no tengo muchas bases para decir esto así podrías usar el que mejor se te acomode a no ser que alguien tenga un comentari al respecto Wink

Cita:
Como veis, en el proceso he perdido aminoácidos de la secuencia A y la B. Partiendo de los valores del Hash para los aminoácidos de la secuencia A que queden, ¿Cómo podría asignar los valores del hash %H que correspondan a la secuencia B?


Código:
Secuencia A = VPIVNLKDEVLSQPGARI
Secuencia B = VPIVNLKDELLFSGSEGPLKPGARI


Suponiendo que las secuencias no son una agrupación de letras si no que son un dato, es decir, en la secuancia A su valor es VPIVNLKDEVLSQPGARI y no es V P I V N L K D E V L S Q P G A R I (terminos no separados) no deberías de tener problemas.

De donde o cómo sacas estos datos?
Si estan en memoria exactamente como los pones no entiendo porque B pierde datos... depronto hay un problema en la forma de contar los elementos de %H o estás incluyendo @B en %H...

A mí me hacen falta datos para poder darte una verdadera ayuda.
Mensaje Mie May 09, 2007 8:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Bienvenido a los foros de Perl en Español.

No lo acabo de entender, tampoco.

Supongo que sabes que los hashes no guardan el orden en que reciben las claves. O dicho de otra manera, no se sabe en qué orden Perl guarda las claves/valor.

Si en una secuencia de aminoácidos, pongamos que guardas el valor del aminoácido 'V' en el hash %H, luego no sabrás si ese aminoácido corresponde al comienzo de la secuencia, al medio o al final. No se guardan posiciones en las claves de los hashes. Ahora bien, estás usando como claves las posiciones de los aminoácidos, por lo que casi lo estás usando como un array.

Entiendo la primera parte de la pregunta, lo de las secuencias @A y @B y que @VALOR guarda los valores de los aminoácidos en función de la posición dentro de la secuencia, pero no entiendo lo que pones después.

A ver... si se trata sólo de asignar los valores almacenados en %H a la secuencia @B, valdría con sacar el listado de las claves de %H. Pero el problema ahora es que se han perdido aminoácidos en @A.

Si en la secuencia final de @A, empieza con el aminoácido 'I', ¿ese 'I' a cuál de los anteriores corresponde?

Yo necesito un detalle un poco mayor.

Por otra parte... si las dos secuencias quedan alineadas al final, ¿no tendrían los aminoácidos de @B que tener el mismo valor que @A? ¿O eso es justo lo que estamos intentando averiguar, que no son iguales?
Mensaje Sab May 12, 2007 2:46 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Después de pensar un poco más en el problema, quizás la solución sea almacenar las posiciones relativas $i de cada aminoácido, para que, después del proceso de alineación, sabremos exactamente a qué aminoácido original corresponde la secuencia que queda, y de ahí, el valor a asignar al Hash.
Mensaje Lun May 14, 2007 11:47 am
Mang
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2007
Mensajes: 4
Responder citando

Hola otra vez compañeros

Gracias por las respuestas y perdón por la tardanza en escribir. He estado mirando el problema y la respuesta era más fácil de lo que os había contado, pero me había liado al plantearlo (cómo se nota que no soy informático;-) y con un array donde conservar los valores bastaba. En fin, gracias por las respuestas y nos vemos en la próxima duda

Saludos
Mensaje Lun May 14, 2007 12:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

Pero... ¿nos puedes explicar un poco más cuál era el problema? ¿Me moriré sin saberlo?
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group