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 hsah et tri


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 hsah et tri
    Hello,

    J'ai un résultat de blast et je souhaiterai faire un tri query par query selon la e-value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tata	d	40.98	266	136	7	164	413	1644	1904	4e-53	 192
    tata	c	48.33	240	123	1	178	416	2237	2476	8e-74	 252
    tata	a	99.52	420	2	0	1	420	1	420	0.0	 876
    lolo  g      44.53   384     196     12      54      429     50      424     2e-101   309
    lolo h     99.68   1247    4       0       1       1247    1       1247    0.0     2520
    lolo  f     99.77   429     1       0       1       429     1       429     0.0      890
    Obtenir comme résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tata	a	99.52	420	2	0	1	420	1	420	0.0	 876
    tata	c	48.33	240	123	1	178	416	2237	2476	8e-74	 252
    tata	d	40.98	266	136	7	164	413	1644	1904	4e-53	 192
    lolo h     99.68   1247    4       0       1       1247    1       1247    0.0     2520
    lolo  f     99.77   429     1       0       1       429     1       429     0.0      890
    lolo  g      44.53   384     196     12      54      429     50      424     2e-101   309
    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
     
    #!usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    my $fichier = '/home/mcorrea/Duplinet/data/Hogenom/Test/evalue_tri';
     
    open my $fh, '<', $fichier or die "Impossible de lire le fichier $fichier\n";
    my %hash=();
    my $i=0;
    while(my $ligne = <$fh>){
    	$i++;
     
    	chomp $ligne;
      	my ($query,$subject,$id,$ali,$mismatches,$gap,$qstart,$qend,$sstart,$send,$evalue,$score) = split "\t", $ligne;
     
            if ( !exists $hash{$query}) {   
                    my $arrayref = sort { $b <=> $a } $hash{$query}{'evalue'};# fait le trie du plus petit au plus grand cf. ordre de $b et $a!
            }
    }
    foreach my $t (keys %hash){
    	foreach (keys %{$hash{$t}}){
     
    print "$hash{$t}\t$hash{$t}{$_}\n";
     
            }
    }
    J'obtiens le message d'erreur : Useless use of sort in scalar context at tri_evalue.pl line 22.
    ce qui correspond à ma ligne my $arrayref = sort { $b <=> $a } $hash{$query}{'evalue'} je ne comprend pas

  2. #2
    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
    avant de sortir l'artillerie lourde et le codage de script, si tu veux juste trier tes résultats, il me semble qu'il existe en général une option dans les blast pour que les résultats sortent triés

  3. #3
    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
    Hello,

    Oui mais je ne pars pas directement de mon fichier de résultats.
    J'ai mes résultats blast que j'ai ensuite traité. Désormais ils ne sont plus trié et je souhaiterait les trier selon query par query (colonne1 ) et selon la e-value

  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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Il fait quelle taille, ton fichier? Selon la taille, la procédure sera un peu différente. C'est assez facile à faire.

    Sinon, l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Useless use of sort in scalar context at tri_evalue.pl line 22.
    est due au fait que tu rediriges le résultat du tri vers une variable scalaire (une seule valeur) et non vers un tableau. De toute façon, même si tu mettais:
    ça ne servirait toujours pas à grand chose car tu perdrais le contenu du tableau dès que tu sors du bloc.

    Donne la réponse à la question de la taille, et je reviendrai te donner une solution plus tard dans la soirée.

  5. #5
    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
    Bon, tant pis pour la taille, on verra plus tard, voici un programme faisant, je pense, ce que tu désires:

    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 strict;
    use warnings;
     
    my @data = <DATA>;
     
    my @sorted_data = map {$_->[2]}
                      sort {$a->[0] cmp $b->[0] || $a->[1] <=> $b->[1]}
                      map {my ($f1, $f2) = (split /\s+/, $_)[0, 10]; [$f1, $f2, $_]}  @data;
     
    print @sorted_data;
     
    __DATA__
    tata	d	40.98	266	136	7	164	413	1644	1904	4e-53	 192
    tata	c	48.33	240	123	1	178	416	2237	2476	8e-74	 252
    tata	a	99.52	420	2	0	1	420	1	420	0.0	 876
    lolo  g      44.53   384     196     12      54      429     50      424     2e-101   309
    lolo h     99.68   1247    4       0       1       1247    1       1247    0.0     2520
    lolo  f     99.77   429     1       0       1       429     1       429     0.0      890
    Ce qui me donne le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl sort_blast.pl
    lolo h     99.68   1247    4       0       1       1247    1       1247    0.0     2520
    lolo  f     99.77   429     1       0       1       429     1       429     0.0      890
    lolo  g      44.53   384     196     12      54      429     50      424     2e-101   309
    tata    a       99.52   420     2       0       1       420     1       420     0.0      876
    tata    c       48.33   240     123     1       178     416     2237    2476    8e-74    252
    tata    d       40.98   266     136     7       164     413     1644    1904    4e-53    192
    Par rapport à l'exemple de résultats que tu as donné, les lignes lolo (merci de les avoir nommées comme ça en mon honneur ) viennent avant les lignes tata, parce c'est comme cela dans l'ordre alphabétique.

    Ce genre de construction "map ... sort ... map" s'appelle la transformation de Schwartz et est expliquée en détail dans la partie consacrée aux tris de données de mon tuto sur les opérateurs de listes.

    Je suis à ta disposition pour des explications complémentaires si nécessaire.

  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,

    Mon fichier fait 58M.
    J'ai effectué un format scientifique sur ma colonne puis j'ai trié suivant la colonne 1 (query) et colonne 11

Discussions similaires

  1. Hash à valeurs multiples et tris.
    Par wulfeir dans le forum Langage
    Réponses: 2
    Dernier message: 27/11/2007, 15h39
  2. Problème lors du tri d'un hash en f(valeurs)
    Par bollo dans le forum Langage
    Réponses: 3
    Dernier message: 03/04/2006, 17h52
  3. Tri par valeur d un hash de hash
    Par LeLaulau dans le forum Langage
    Réponses: 4
    Dernier message: 28/09/2005, 10h33
  4. [langage] Tri de valeurs dans un hash
    Par Arioch dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2004, 11h35
  5. [langage] hash et tri
    Par perlaud dans le forum Langage
    Réponses: 4
    Dernier message: 20/09/2004, 16h17

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