• Publicidad

Asignar valores guardados en un hash a otros datos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Asignar valores guardados en un hash a otros datos

Notapor Mang » 2007-05-09 06:51 @327

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: Seleccionar todo
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: Seleccionar todo
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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $i=0;
do {

    $H{$i}=$VALOR[$i];
 
    $i++;
} until ($i==scalar@A);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Vale, el código podría escribirse mejor, pero bueno, estoy aprendiendo ;-)

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

Código: Seleccionar todo
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:
Mang
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-05-09 05:07 @255

Publicidad

Notapor creating021 » 2007-05-09 18:38 @818

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $i=0;
do {

    $H{$i}=$VALOR[$i];
 
    $i++;
} until ($i==scalar@A);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for(my $i = 0; $i <= $#A; $i++){
  $H{$i} = $VALOR[$i]
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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:

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: Seleccionar todo
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.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-05-09 21:18 @929

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?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-05-12 15:46 @699

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Mang » 2007-05-14 12:47 @574

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
Mang
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-05-09 05:07 @255

Notapor explorer » 2007-05-14 13:17 @595

Pero... ¿nos puedes explicar un poco más cuál era el problema? ¿Me moriré sin saberlo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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

cron