IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

un problème algo


Sujet :

Bioinformatique Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut un problème algo
    Bonjour,
    J'ai des éléments et je dois faire en sorte que ceux-ci ne se recouvrent pas. J'entend par là que :

    Si des éléments ont la même position de début, alors je dois prendre le plus grand
    Exemple : toto20 8 10 et toto 8 18 On garde toto 8 18
    Si des éléments ont la même position de fin, alors je dois prendre le plus grand.
    Exemple toto79 98 110 et toto79 100 110 et toto79 105 110 On garde toto 98 110
    Si on a des élément qui sont inclus dans l'un des plus grand ci-dessus on ne le garde pas
    Exemple : toto20 5 15 on ne le garde pas car est inclus dans toto20 8 18 de même que toto 8 10
    type de fichier
    toto79 3 110 . 7 14
    toto79 3 110 . 98 110
    toto20 5 50 . 8 18
    toto20 5 50 . 8 10
    toto79 3 110 . 100 110
    toto79 3 110 . 28 78
    toto20 5 50 . 30 40
    toto79 3 110 . 105 110
    Résultat attendus
    toto20 5 50 . 8 18
    toto20 5 50 . 30 40
    toto79 3 110 . 28 78
    toto79 3 110 . 7 14
    toto79 3 110 . 98 110


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    my %test=();
     
    while(my $ligne = <IN>){
            chomp $ligne;
    my ($f0,$f01,$f02,$f03, $f2,$f3)= (split /\t/, $ligne);
    my $all="$f2"."\t"."$f3";
    #même début, mais fin différente
    if ( !exists $test{$all} or (($test{$f2}{'deb'} == $f2 and $test{$f2}{'fin'} > $f3)) ){
    $test{$f2}{'deb'}=$f2;
    		$test{$f2}{'fin'} = $f3;
                    $test{$f2}{'element'}=$f1;
     
            }
    #même fin, mais début différente
    }
    close(IN);
    foreach my $val (keys %test){
            print "$test{$val}{'element'}\t$test{$val}{'deb'}\t$test{$val}{'fin'}\n";
    }
    Quelqu'un peux aider?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    dans ton explication tu as toujours 2 valeurs, mais dans ton exemple 5. Comment faut-il comprendre?

    Perso, je verrais bien un hash contenant une liste de de paires. Ensuite, on trie les paires, par exemple par valeurs de début croissantes, et on examine les bons appariements. Et on recommence avec les valeurs de fin.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Bonjour,

    MERCI
    Ah oui désolé, dans mon exemple j'ai 5 valeurs mais en fait les colonnes 2,3 et 4 ne m'intéresse pas.Seul les colonnes 1 (identifiant), colonnes 5 (début) et 6 (fin), m'intéresse.

    Je suis désolé mais quand tu dis "je verrais bien un hash contenant une liste de de paires", donc d'après mon exemple qu'est ce qui va constituer ma clé et ma valeur?
    toto79 3 110 . 7 14 => PAIRE 1
    toto79 3 110 . 98 110 => PAIRE 2

    "on examine les bons appariements", en fait je veux éliminer les éléments qui se chevauchent

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    OK une ou deux étapes préliminaires qui devraient te mettre sur la voie et te permettre de démarrer (note: j'élimine les colonnes intermédiaires pour simplifier l'exemple, il est facile de les garder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %data;
     
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my ($id, undef, undef, undef, $debut, $fin) = split /\s+/, $line;
    	push @{$data{$id}}, [$debut, $fin];
    }
     
    for my $id (keys %data) {
        my @array = @{$data{$id}};
    	@array = sort {$a->[0] <=> $b->[0]} @array;
    	$data{$id} = \@array;
    }
    print Dumper \%data
     
    __DATA__
    toto79 3 110 . 7 14
    toto79 3 110 . 98 110
    toto20 5 50 . 8 18
    toto20 5 50 . 8 10
    toto79 3 110 . 100 110
    toto79 3 110 . 28 78
    toto20 5 50 . 30 40
    toto79 3 110 . 105 110
    Ce qui donne les valeurs triées pour chaque identifiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    $VAR1 = {
              'toto79' => [
                            [
                              7,
                              '14'
                            ],
                            [
                              28,
                              '78'
                            ],
                            [
                              98,
                              '110'
                            ],
                            [
                              100,
                              '110'
                            ],
                            [
                              105,
                              '110'
                            ]
                          ],
              'toto20' => [
                            [
                              8,
                              '18'
                            ],
                            [
                              8,
                              '10'
                            ],
                            [
                              30,
                              '40'
                            ]
                          ]
            };
    Avec les valeurs triées, il devrait être assez facile de choisir les enregistrements à garder pour ta première règle.

    Il suffit ensuite de recommencer le tri sur la fin pour ta deuxième règle,.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Bonjour,

    Je suis dessus mais je bloque complètement!!

    J'essaye de traiter ce cas là (même début, mais fin différente)
    ensg20 5 50 exon4 8 18
    ensg20 5 50 exon4 8 10

    J'obtiens à la fin
    gene:ensg20 deb : 8 fin:10

    Là je travaille sur une liste de liste, le seul moyen que j'ai trouvé pour afficher les éléments de la paire sont $$e[0] et $$e[1] (je ne sais pas si il est bon d'utiliser cette annotation!) .



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    my %data;
    my %test=();
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my ($id, undef, undef, undef, $debut, $fin) = split /\t/, $line;
    	push @{$data{$id}}, [$debut, $fin];
    }
     
    for my $id (keys %data) {
    	my @array = @{$data{$id}};
    	@array = sort {$a->[0] <=> $b->[0]} @array;
    	$data{$id} = \@array;
    print Dumper(@array);
     
     
     
    foreach my $e (@array){
                     #même début, mais fin différente
    		if( (!exists $test{@{$data{$id}[0]}}) or (($test{$id}{'deb'} == $$e[0] and $test{$id}{'fin'} < $$e[1])) ){
    			$test{$id}{'deb'} = $$e[0];
    			$test{$id}{'fin'} = $$e[1];
     
    		}
    }
    print "\nRESULTATs\n\n";
     
    foreach my $gene (keys %test){
            print "gene:$gene\tdeb : $test{$gene}{'deb'}\tfin:$test{$gene}{'fin'}\n";
    }

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je regarderai ton code plus tard quand je serai sur un ordi avec Perl (là, je suis sur une tablette), mais je te conseille un peu de lecture sur le débogage en Perl: https://perl.developpez.com/faq/perl...gage-sous-Perl.

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pontarose Voir le message
    Là je travaille sur une liste de liste, le seul moyen que j'ai trouvé pour afficher les éléments de la paire sont $$e[0] et $$e[1] (je ne sais pas si il est bon d'utiliser cette annotation!) .
    Oui, c'est OK d'utiliser cette syntaxe, mais tu peux aussi utiliser:
    si tu préfères.

Discussions similaires

  1. Poker - Problème Algo
    Par xinu1.1 dans le forum Langage
    Réponses: 9
    Dernier message: 17/06/2009, 16h54
  2. Problème algo [calcul de moyenne]
    Par Nathan66 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/10/2008, 08h15
  3. [Tableaux] Problème algo récursif
    Par Invité dans le forum Langage
    Réponses: 38
    Dernier message: 03/10/2006, 15h49
  4. problème algo
    Par petitgato dans le forum C
    Réponses: 1
    Dernier message: 17/03/2006, 12h32
  5. Problème algo de parcour de graphe
    Par goblin dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo