Página 1 de 1

Separar y contar ocurrencias de una cadena

NotaPublicado: 2011-12-29 12:55 @579
por Victorio
Estimados:

Necesito una pequeña ayudita en cuanto a un programa:

Tengo una cadena de ADN: actgactgactg... en forma de $cadena, y quiero coger los elementos de 2 en 2 o en n veces y contar las veces que suceden.

Lo he probado como substrings en la secuencia que te digo de ejemplo: ac, ct, tg, ga... y numerar las veces que aparecen cada tipo.

He intentado con arrays, con hashes y con toda clase de bucles y no me sale nada.

Muchas gracias por anticipado, confío en que me ayuden.

Re: Separar y contar ocurrencias de una cadena

NotaPublicado: 2011-12-29 13:19 @597
por explorer
Bienvenido a los foros de Perl en español, Victorio.

Hace muy poco hemos comentado cómo generar las distintas combinaciones de secuencias de bases.

Entonces sería así:
Por cada combinación...
... Hacemos un bucle con index() para localizar el número de veces que esa secuencia aparece
... Informamos del número de veces que se repite

Re: Separar y contar ocurrencias de una cadena

NotaPublicado: 2011-12-29 16:31 @729
por Victorio
Gracias, funciona muy bien para lo que está diseñado. No obstante lo que yo buscaba era indexar todas las ocurrencias de la cadena, no sólo la que yo busco.

Ejemplo:
ac: 2 veces
gt: 23 veces
...

Un saludo

Re: Separar y contar ocurrencias de una cadena

NotaPublicado: 2011-12-29 18:34 @815
por explorer
Es que precisamente, generamos todas las combinaciones (hasta de una longitud máxima), y contamos las veces que aparecen...

Con este programa
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 Algorithm::Combinatorics 'variations_with_repetition';
  8.  
  9. my $secuencia;
  10. while (<DATA>) {                                                # leemos todas las líneas
  11.     chomp;                                                      # quitar finales de línea    
  12.     $secuencia .= uc $_;                                        # pasamos a mayúsculas, y agregamos
  13. }
  14.  
  15. #say "[$secuencia]";
  16.  
  17. for my $n (1 .. 8) {
  18.  
  19.     my @combinaciones = variations_with_repetition(['A','T','C','G'], $n);
  20.  
  21.     for my $x (@combinaciones) {
  22.         my $seq = join '', @$x;
  23.  
  24.         my $pos        = 0;
  25.         my $encontrado = 0;
  26.          
  27.         while (1) {                                             # Bucle infinito
  28.             $pos = index $secuencia, $seq, $pos;                # Buscamos $seq en $secuencia a partir de $pos
  29.  
  30.             last if $pos == -1;                                 # No encontrado, terminamos
  31.  
  32.             $encontrado++;                                      # Sí, encontrado una vez más
  33.             $pos++;                                             # Saltamos a la siguiente posición de búsqueda
  34.         }
  35.          
  36.         if ($encontrado) {
  37.             say "[$seq] $encontrado veces";
  38.         }
  39.     }
  40. }
  41.  
  42. __DATA__
  43. cccgctcagctcctggggcttctgctgctctggctcccaggtgccagatgtgccatccag
  44. ttgacccagtctccatcctccctgtctgcatctgtaggagacagagtcaccatcacttgc
  45. cgggcaagtcagggcataagcagtgctttagcctggtatcagcagaaaccagggaaagct
  46. cctaagctcctgatctatgatgcctccagtttggaaagtggggtcccatcaaggttcagc
  47. ggcagtggatctgggacagatttcactctcaccatcagcagcctgcagcctgaagatttt
  48. gcaacttattactgtcaacagtttaatacttacccgctcactttcggcggagggaccaag
  49. gtggagatcaaacga
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[A] 85 veces
[T] 89 veces
[C] 107 veces
[G] 94 veces
[AA] 17 veces
[AT] 18 veces
[AC] 16 veces
[AG] 33 veces
[TA] 11 veces
[TT] 20 veces
[TC] 32 veces
[TG] 26 veces
[CA] 37 veces
[CT] 33 veces
[CC] 30 veces
[CG] 7 veces
[GA] 20 veces
[GT] 18 veces
[GC] 28 veces
[GG] 28 veces
[AAA] 4 veces
[AAT] 1 veces
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4