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 :

hash de hash et


Sujet :

Bioinformatique Perl

  1. #1
    Membre du Club
    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
    Points : 57
    Points
    57
    Par défaut hash de hash et
    J'ai un fichier de ce type (identifiant du gène, taille, classe)
    gene260 10 classeD
    gene260 15 classeS
    gene260 30 classeS
    gene260 3 classeL
    gene260 7 classeD
    gene75 8 classeS
    gene75 2 classeS
    gene75 5 classeS
    J'ai 4 classes (D,S,L,T)
    Je souhaiterai obtenir pour chaque classe d'un gène donnée, la taille. Pour la classe all (classe que je crée) je souhaiterai la taille totale toute classe confondu. soit,
    gene260 classeD 17(10+7)
    gene260 classeS 45(15+30)
    gene260 classeL 3
    gene260 classeT 0
    gene260 all 65(10+15+30+3+7)
    gene75 classeD 0
    gene75 classeS 15(8+2+5)
    gene75 classeL 0
    gene75 classeT 0
    gene75 all 15(0+8+2+5)
    Je suis parti sur un hash de hash du genre
    $hash{ gene } = {
    classeD => 10,7,
    classeS => 15,30,
    classeL => 3,
    classeT => 0,
    all => 10,15,30,3,7,
    };
    Voilà le début de mon code, mais j'ai des souci pour prendre en compte "un gène donnée d'une classe"
    Mon code suivant m'affiche
    gene260 classeD 17
    gene75 classeS 15



    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use Bio::SeqIO;
    use List::Util qw(sum);
     
     
    my %hash=();
    my %new=();
    my @tab;
    my @classe2 ;
    my $gene;
     
     
    open FILE, "corrige" or die $!;
    while(my $ligne = <FILE>){
    	chomp $ligne;
    	if($ligne  =~ /^#(gene.*)\t([0-9]*)$/){
    		$hash{$1}=$1;
    		@tab = (); #déclarer un tableau vide tableau contient tous les ensg...
                    @classe2 = ();
    	}
     	elsif($ligne  =~ /(.*)\t([0-9]*)\t(.*)$/){
    		my $gene=$1;
    		my $taille=$2;
    		my $classe=$3;
    		if (exists $hash{$gene}){   
    			if($classe eq "classeD" ){				
    				push (@tab,$taille);
     
    				#somme	de la colonne							
    				my $somme = sum(@tab);
    				print "somme : $somme\n";
    				$new{$gene} = {classeD => $somme};
    			}
    			if($classe eq "classeS" ){
    				print "$ligne\n";
    				push (@classe2,$taille);
    				print "sss@classe2\n";
     
    				#somme	de la colonne							
    				my $somme = sum(@classe2);
    				print "somme : $somme\n";	
    				$new{$gene} = {classeS => $somme};
     
    			}
    		}
    	}
    }
    foreach my $c (keys %new){
    	foreach (keys %{$new{$c}}){
    		print "$c\t$_\t$new{$c}{$_}\n";
    	}
    }

  2. #2
    Membre du Club
    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
    Points : 57
    Points
    57
    Par défaut
    Ce n'est certainement pas la façon de le faire proprement.
    MON SOUCI est de prendre en compte la classe "classeT" et "all"?


    Mon code suivant affiche
    gene260 classeL 3
    gene260 classeS 45
    gene260 classeD 17
    gene75 classeS 15



    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use Bio::SeqIO;
    use List::Util qw(sum);
     
     
    my %hash=();
    my %new=();
    my @tab;
    my @classe2 ;
    my @classe3 ;
    my @classe4 ;
     
    my $gene;
     
     
    open FILE, "corrige" or die $!;
    while(my $ligne = <FILE>){
    	chomp $ligne;
    	if($ligne  =~ /^#(gene.*)\t([0-9]*)$/){
    		$hash{$1}=$1;
    		@tab = (); 
    		@classe2 = ();
    		@classe3 = ();
    		@classe4 = ();
     
    	}
     	elsif($ligne  =~ /(.*)\t([0-9]*)\t(.*)$/){
    		my $gene=$1;
    		my $taille=$2;
    		my $classe=$3;
    		if (exists $hash{$gene}){   
                            #print "$ligne\t$hash{$gene}\n";
    			if($classe eq "classeD" ){				
    				push (@tab,$taille);
     
    				#somme	de la colonne							
    				my $somme = sum(@tab);
    				print "somme : $somme\n";
    				$new{$gene}{'classeD'} = $somme;
    			}
     
    			if($classe eq "classeS" ){
    				print "$ligne\n";
    				push (@classe2,$taille);
    				print "sss@classe2\n";
     
    				#somme	de la colonne							
    				my $somme = sum(@classe2);
    				print "somme : $somme\n";	
    				$new{$gene}{'classeS'} = $somme;
     
    			}
    			if($classe eq "classeL" ){
    				print "$ligne\n";
    				push (@classe3,$taille);
    				print "sss@classe3\n";
     
    				#somme	de la colonne							
    				my $somme = sum(@classe3);
    				print "somme : $somme\n";	
    				$new{$gene}{'classeL'} = $somme;
    			}
     
    			if($classe eq "classeT" ){
    				print "$ligne\n";
    				push (@classe4,$taille);
    				print "sss@classe4\n";
     
    				#somme	de la colonne							
    				my $somme = sum(@classe4);
    				print "sommeTTT : $somme\n";
    				$new{$gene}{'classeT'} = $somme;
     
    			}
    		}
    	}
     
    }
    foreach my $c (keys %new){
    	foreach (keys %{$new{$c}}){
    		print "$c\t$_\t$new{$c}{$_}\n"; 
    	}
    }

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    j'ai pas trop compris ce que tu souhaites faire (comptage ou liste des nombres), mais si tu veux récupérer un comptage pour chaque couple gene/classe, ce bout de code devrait fonctionner (mais pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my %hash;
    open(FH_IN, 'ton fichier');
    while(<FH_IN>){
         if ( $_ =~ /(\S+)\s+(\S+)\s+(\S+) ){
              if (!defined $hash{$1}{$3} ){
                   $hash{$1}{$3} = $2;
                   $hash{$1}{'all'} = $2;
              }
              else{
                   $hash{$1}{$3} += $2;
                   $hash{$1}{'all'} += $2;
              }
         }
    }
    Dans cette méthode, tu n'auras que les couples rencontrés et donc si tu veux que tous les couples soient dans le tableau, il suffit d'initialiser le niveau 'classe' dès que tu trouves un nouveau gène

  4. #4
    Membre du Club
    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
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Merci Djibril, c'est exactement ce que je veux faire et je bloquais depuis un moment.
    * Je ne comprend pas pourquoi ça ne marche pas avec 'all'? (le script m'a l'air bon, mais ça n'incrémente pas!)
    Je souhaiterai avoir :
    gene260 all 65
    gene75 all 15
    * tu me dis que "dans cette méthode, tu n'auras que les couples rencontrés et donc si tu veux que tous les couples soient dans le tableau, il suffit d'initialiser le niveau 'classe' dès que tu trouves un nouveau gène", mais je ne vois pas comment faire. Je met dans une liste toute mes classes, mais ensuite je teste mes différentes classes mais du coup je me retrouve bloqué comme dans mon cas script précedent.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par pontarose Voir le message
    Bonjour,

    Merci Djibril, c'est exactement ce que je veux faire et je bloquais depuis un moment.
    de rien
    Citation Envoyé par pontarose Voir le message
    * Je ne comprend pas pourquoi ça ne marche pas avec 'all'? (le script m'a l'air bon, mais ça n'incrémente pas!)
    Je souhaiterai avoir :
    gene260 all 65
    gene75 all 15
    il ne traite pas du tout le cas des 'all'? ou il ne les incrémente pas?
    Utilise le "Dumper" comme dans l'exemple ci-dessous pour avoir la structure de ton hash de hash.

    Citation Envoyé par pontarose Voir le message
    * tu me dis que "dans cette méthode, tu n'auras que les couples rencontrés et donc si tu veux que tous les couples soient dans le tableau, il suffit d'initialiser le niveau 'classe' dès que tu trouves un nouveau gène", mais je ne vois pas comment faire. Je met dans une liste toute mes classes, mais ensuite je teste mes différentes classes mais du coup je me retrouve bloqué comme dans mon cas script précedent.
    En fait, tu as 3 solutions:
    - soit tu utilises mon exemple mais quant tu traiteras ces résultats tu parcoureras ton hash de hash
    - soit tu utilises mon exemple mais quant tu traiteras ces résultats en parcourent ta liste, il faut géré le cas ou la clé n'existe pas
    - soit tu utilises mon exemple modifié (ci-dessous) et tu pourras parcourir ta liste sans problème

    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
    use Data::Dumper;
    my %hash;
    open(FH_IN, 'ton fichier');
    while(<FH_IN>){
         if ( $_ =~ /(\S+)\s+(\S+)\s+(\S+) ){
              if (!defined $hash{$1} ){
                   $hash{$1}{'classeL'} = 0;   # definition manuelle ca plus simple pour moi ici 
                   $hash{$1}{'classeD'} = 0;   # mais il faut faire de maniere auto en parcourant
                   $hash{$1}{'classeS'} = 0;   # ta liste de classe
                   $hash{$1}{'all'} = 0;
              }
     
              $hash{$1}{$3} += $2;
              $hash{$1}{'all'} += $2;
     
         }
    }
    Dumper(\%hash);

  6. #6
    Membre du Club
    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
    Points : 57
    Points
    57
    Par défaut
    Merci Djibril.
    J'ai toujours du mal à penser mes algo et je fais des choses compliqués!

    Il ne traite pas du tout le cas des 'all'? ou il ne les incrémente pas?
    Utilise le "Dumper" comme dans l'exemple ci-dessous pour avoir la structure de ton hash de hash.
    Merci pour Dumper; il ne les incrémentait pas!
    Oui j'ai compris avec l'initialisation du gène.

    Encore merci

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    je trouve que dans les 3 propositions la meilleur est, selon ton besoin la 1 ou la 2 car la dernière ne présente aucun intérêt à mes yeux
    surtout en bioinfo où la quantité de données est énorme et donc il vaut mieux ne pas stocker des infos pour rien


    si tu as besoin d'aide pour utiliser les premières propositions poste ton code et on t'aidera

  8. #8
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pontarose Voir le message
    Merci Djibril.
    Celui qui t'a aidé s'appelle Cyril, pas Djibril, qui tu as remercié à 2 reprises...




+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. Réponses: 6
    Dernier message: 05/07/2005, 11h05
  3. Réponses: 2
    Dernier message: 09/03/2005, 14h35
  4. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  5. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55

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