Separar y contar ocurrencias de una cadena
Publicado:
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
Publicado:
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
Publicado:
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
Publicado:
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
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use diagnostics;
use Algorithm::Combinatorics 'variations_with_repetition';
my $secuencia;
while (<DATA>) { # leemos todas las líneas
chomp; # quitar finales de línea
$secuencia .= uc $_; # pasamos a mayúsculas, y agregamos
}
#say "[$secuencia]";
for my $n (1 .. 8) {
my @combinaciones = variations_with_repetition(['A','T','C','G'], $n);
for my $x (@combinaciones) {
my $seq = join '', @$x;
my $pos = 0;
my $encontrado = 0;
while (1) { # Bucle infinito
$pos = index $secuencia, $seq, $pos; # Buscamos $seq en $secuencia a partir de $pos
last if $pos == -1; # No encontrado, terminamos
$encontrado++; # Sí, encontrado una vez más
$pos++; # Saltamos a la siguiente posición de búsqueda
}
if ($encontrado) {
say "[$seq] $encontrado veces";
}
}
}
__DATA__
cccgctcagctcctggggcttctgctgctctggctcccaggtgccagatgtgccatccag
ttgacccagtctccatcctccctgtctgcatctgtaggagacagagtcaccatcacttgc
cgggcaagtcagggcataagcagtgctttagcctggtatcagcagaaaccagggaaagct
cctaagctcctgatctatgatgcctccagtttggaaagtggggtcccatcaaggttcagc
ggcagtggatctgggacagatttcactctcaccatcagcagcctgcagcctgaagatttt
gcaacttattactgtcaacagtttaatacttacccgctcactttcggcggagggaccaag
gtggagatcaaacga
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
sale:
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