in reply to Re^2: Building an array of hashes, and then sorting keys with each hash
in thread Building an array of hashes, and then sorting keys with each hash

Run it...
  • Comment on Re^3: Building an array of hashes, and then sorting keys with each hash

Replies are listed 'Best First'.
Re^4: Building an array of hashes, and then sorting keys with each hash
by odegbon (Initiate) on Dec 31, 2009 at 07:46 UTC
    I have 2 different IDs in my hits and I am trying to retrieve best hit for each ID based on best scores as in my post before this.

    I have tried to do something like this:

    $hITS[0]{score} = $score; $hITS[0]{qID} = $Id; for (@hITS){</p if ($_->{qID} !~ /$id/ && $_->{score} <= $score){</p> $_->{qID} =$id1 ; $_->{score} = $score1;

    not sure about the above.

Re^4: Building an array of hashes, and then sorting keys with each hash
by odegbon (Initiate) on Dec 31, 2009 at 05:41 UTC
    I have a scenario where everything in my hits(rows) is the same as above except that I now have 2 different IDs in the ID column . I want to try to retrieve the best match/(row) for each ID based on their top score. For instance, the actual IDs in hits - pwc and pwz respectively.

    I have tried to sort IDs first and then scores:

    <code>@hITS = sort ($a->{qID} cmp $b->{qID} || $b->{score} <=> $a->{score})@hITS;

    now I would like to retrieve best score/row for each ID:

      I want to try to retrieve the best match/(row) for each ID based on their top score.

      You want to group the records by id, and sort each group by score.

      Hashes are great for grouping.

      my %rows_by_id; while (<CBLAT>) { chomp; my %row; @row{qw( score id )} = ( split /\t/ )[ 0, 9 ]; my $id = $row{id}; push @{ $rows_by_id{$id} }, \%row; } for my $id (keys %rows_by_id) { # Add "sort" if desired my $rows = $rows_by_id{$id}; @$rows = sort { $b->{score} <=> $a->{score} } @$rows; my $best_row = $rows->[0]; print("Best score for id $id: $best_row->{score}\n"); }
        Hi,

        I have run the code in your last post and it doesn't give any output or error messages in the end. But when I put a "print" statement after the 6th line, it did print the IDs.

        It seems the part of the code after that line is missing something and I have been trying to figure it out.