• Publicidad

Randomizar datos por columnas

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Notapor Cristina » 2009-02-27 14:12 @633

Si, explorer, ¡¡¡¡es muy posible!!!! Hay masters enteros en los que no programas nada (te diría que casi todos los que conozco), yo hice un post-doc e incluso doy ahora clases de bioinformática en postgrados. Se pueden hacer muchos análisis sin saber programar, usando herramientas ya desarrolladas. Muchos son usuarios y muy pocos desarrolladores de software.
El problema es cuando tienes una idea diferente y quieres probarla, o mejorar una herramienta que no encaja exactamente en lo que quieres hacer.
Me pondré con BioPerl, ¡pero me pareció que antes debía saber un poco de Perl!
Muchos saludos.
¡Buen fin de semana!
Cristina
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-02-05 10:17 @470

Publicidad

Notapor explorer » 2009-02-27 14:35 @649

Esto es algo que comenté con un catedrático de la Autónoma de Madrid: en la profesión (bioinformático) había sitios donde había muchos que venían de la rama de biología y en otros, de la parte de informática. Pero al final reconocía que tenían una ligera ventaja los informáticos, en la destreza de la profesión, porque al final había que implementar desarrollos en las máquinas (el cómo) mientras, los biólogos dictaban el qué había que implementar. Hasta ahora, los laboratorios hacían eso: tenían dos personas, expertas cada uno en su campo. Lo que ahora se demanda es que el biólogo sepa manejar programas prefabricados. Y el informático, conocer los términos biológicos básicos para saber de qué estamos hablando. Y si lo tenemos todo en uno, aún mejor.

Me quiso convencer para hacer un Máster, pero hablando con antiguos alumnos, te enterabas de que prácticamente no hay salida laboral ninguna (en España). Alguna conozco que tuvo hacer las australias.

Y no te recomiendo que te metas con BioPerl a no ser que llegues a entender antes lo que es programación orientada a objetos en Perl. Bueno... quiero decir... que la mayor parte de los módulos de BioPerl están escritos en forma de objetos y métodos sobre esos objetos. Eso sí, la sintaxis es casi siempre la misma, así que no hay mucho problema por esa parte y se aprende rápido.

Lo que sí es necesario es tener un poco de idea -general, no exhaustiva- de toda la sintaxis de Perl. Y para ello sería estupendo leer mucho código y hacer alguna prueba (leer perlsyn y perlop sería estupendo)

Es algo así como pasar de dibujar con el Paint de Windows, a dibujar con las herramientas del AutoDesk Inventor. No es trivial el cambio... 8)

De hecho, muchas tareas en bioinformática se pueden realizar sin el paquete BioPerl, usando Perl del básico, básico. Por eso se sigue usando tanto: por sus habilidades en el tratamiento de cadenas de caracteres y otras estructuras de datos.

Yo he intentado varias veces meterme en el mundillo, pero es que es imposible si no tienes al lado un laboratorio que se fíe de tu pericia.
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 » 2009-02-27 17:54 @787

Esta es una solución. Pero no es la mejor. Seguro que hay otras mejores.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use List::Util 'shuffle';

my $fichero = <<EOF;
12345
67890
ABCDE
FGHIJ
EOF



## Lectura
# Lo pasamos a estructura bidimensional
my @matriz;
for (split "\n", $fichero) {
    push @matriz, [ split // ];
}

# Número de filas
my $max_j = $#matriz;

use Data::Dumper;
print Dumper \@matriz;


## Aleatoridad
# Recorremos en longitud
my $max_i = $#{$matriz[0]};

# Por cada columna, elegimos un orden aleatorio de las filas
for my $i (0 .. $max_i) {

    # Elegimos un orden aleatorio
    my @orden = shuffle 0 .. $max_j;

    # Leemos la columna $i, de forma aleatoria
    my @anteriores;
    for my $j (0 .. $max_j) {
        push @anteriores, $matriz[ $orden[$j] ][ $i ];
    }

    # Nuevos valores en la columna $i
    for my $j (0 .. $max_j) {
        $matriz[$j][$i] = $anteriores[$j];
    }
}

print Dumper \@matriz;

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
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 kidd » 2009-02-27 21:25 @934

Yo tengo otra solución:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @Columnas;

my $r = 0;

for my $data( split /\n/, $fichero ){

    my $c = 0;
    for (split //, $data) {
        $Columnas[$c][$r] = $_;
        $c++;
    }

    $r++;
}


my @NuevoData;

#Creamos las nuevas líneas aleatorias
for my $i(0..@Columnas){

    my $c = 0;
    for( shuffle @{$Columnas[$i]} ){
        $NuevoData[$c][$i] = $_;
        $c++;
    }

}


print Dumper(\@NuevoData);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hice un benchmark comparativo entre la solución de Joaquín y la mía, este es el resultado:

Código: Seleccionar todo
Benchmark: timing 100000 iterations of explorer, uriel...
  explorer:  9 wallclock secs ( 9.03 usr +  0.00 sys =  9.03 CPU) @ 11072.97/s (n=100000)
     uriel: 10 wallclock secs ( 9.42 usr +  0.00 sys =  9.42 CPU) @ 10613.46/s (n=100000)


Así que aunque mi solución demuestra que hay más de una manera de hacer las cosas en Perl, la de Joaquín sigue siendo la más efectiva :wink:

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Perl user » 2009-02-28 16:28 @728

Yo también juego... tengo otra solución:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;
use List::Util qw(shuffle);
use Data::Dumper;

tie my @data, "Tie::File", 'random.txt' or die $!;

my @rdata;

for (0..$#data) {
    my @rlist = (shuffle(split '', $data[$_]),
                 shuffle(split '', $data[int rand $#data]));

    my $str;
    for (1..length($data[$_])) {
        $str .= $rlist[int rand $#rlist];
    }

    push @rdata, $str;
}
untie @data;

print Dumper \@rdata;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En realidad la solución es muy trivial, y puedes reemplazar el uso de Tie::File por tu módulo favorito para tratar tus datos como:
1) Archivo de texto plano
2) Cadena de caracteres
3) Otro medio persistente (BD, etc...)

Así que eso solo lo puse considerando que la entrada es un archivo y necesitas generar una estructura que, opcionalmente, podrá ser almacenada en un mismo medio.

El problema con la aleatoriedad (odio randomizar) de datos es que el resultado dependerá de factores no necesariamente ligados al algoritmo de la solución de este problema; dependiendo de lo que utilice rand internamente para calcular elementos aleatorios a partir de una semilla será el resultado de la distribución normal que tenga función.

Por otro lado, evaluar la eficiencia de cada uno de los algoritmos propuestos tampoco será tan sencillo con tan solo utilizar Benchmark, que analiza tiempo de ejecución en términos de utilización de recursos como CPU, sino dependerá de la carga de datos de entrada de manera que permita ver el deterioro del algoritmo entre más grande este sea. Si la entrada de datos no es muy grande, y las restricciones de ejecución no son un problema, cualquier solución funciona, aunque cada una de las propuestas tienen diversas formas de calcular aleatoriedad entre el resultado final.

Por lo contrario, si tu resultado también se ve afectado por problemas como tiempo de ejecución, entonces Perl definitivamente no es la herramienta para esto y propongo echarle un vistazo a otros algoritmos aleatorios y de mezcla (shuffle) menos generales. Algunos otros ejemplos los puedes encontrar en perldoc -q random.

Un saludo,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer » 2009-02-28 21:09 @923

Me temo, Perl User, que esa no es la salida que quiere Cristina. He probado tu solución y me salen elementos repetidos.

Parece que quiere barajar por columnas, no por filas. Y no repetir elementos.
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 Perl user » 2009-02-28 21:30 @938

Vaya, se me saltó ese detalle que es por columnas, pero de la misma manera el algoritmo no cambia mucho, por cada fila actual, toma aleatoriamente una línea, y su columna correspondiente colócala en la posición de la columna actual. Sigue siendo trivial.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;
use Tie::File;
use Data::Dumper;

tie my @data, "Tie::File", 'random.txt' or die $!;

my @rdata;

foreach my $line (@data) {
    my $str;
    for (0..length($line) - 1) {
        $str .= substr($data[int rand @data], $_, 1);
    }

    push @rdata, $str;
}
untie @data;

print Dumper \@rdata;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que no veo en todo el post es dónde ella menciona "no elementos repetidos", allí es cuando nuestro concepto de "aleatoriedad" puede fallar, aleatorio no implica no repetido. Si se quiere elementos no repetidos entonces el concepto de "aleatorio" cambia por simple "mezcla" de elementos no repetidos.

Por otro lado, también hay diversas maneras de afrontar el problema, por ejemplo si la representación de los datos es de forma matricial, si son simplemente cadenas de texto, etc.

Nuevamente, creo que habría que definir exactamente qué necesitamos aleatorio y qué necesitamos como simples intercambios. Si no, entonces MI concepto de aleatorio y la idea que tengo sobre la solución a la pregunta de Cristina es completamente errónea . :D

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer » 2009-02-28 22:11 @965

El ejemplo que mandó Cristina el día 27/02 a las 19:52 CET @869, me inclina a pensar que quiere justamente eso: mezclar, y no extraer de forma aleatoria.
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 Perl user » 2009-03-01 04:16 @219

Va, entonces tenemos formas MUY diferentes de entender problemas y sobre todo de "aleatoriedad". Pero espero le sirva la solución a Cristina :)

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor Cristina » 2009-03-04 08:03 @377

Mil gracias, Explorer, Kidd y Perl user.

Explorer, es como vos decís, es mas fácil pasar de informático a la rama de biología que viceversa, ¡¡¡te diría que bastante!!! mirá que mi formación no fue mala, hice un post doc en bioinformática de 2 años con un jefe muy prestigioso en la Universidad de Cambridge, cursos en el EMBL Heidelberg y más.

Para peor, estoy en Argentina en un instituto de investigación biofísica de proteínas y NADIE conoce ningún lenguaje de programación. Por suerte colaboro con un investigador Danés que es el que saca los bollos y es un genio programador de C. Pero te digo que a la hora de interpretar sutilezas en el análisis de resultados, andamos mucho mejor.

Quiero decirles que agradezco MUCHÍSIMO y admiro que alguien se tome el tiempo de dar una mano a otro a cambio de nada, ¡o casi nada! Ojalá yo un día pueda devolverlo (creo que en otros campos lo hago).

Explorer, tomaré tu consejo de leer esos textos y probaré los códigos que me han mandado.

Por suerte no tengo problema de tiempo de cálculo. Para compartir y que no sea todo malo, les cuento que el viernes ¡¡¡me aceptaron un paper en la revista Bioinformatics!!!

Besos a los tres y hasta pronto.
Cristina
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-02-05 10:17 @470

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron