Группировка табличных данных по нескольким столбцам - PullRequest
0 голосов
/ 24 мая 2019

У меня есть данные в этом формате

b1  1995    1
b1  2007    0.1
b2  1974    0.1
b2  1974    0.6
b2  1975    0.3

И я хочу суммировать значения в столбце 3 на основе одинаковых значений в обоих столбцах 1 и 2.

Я написал код, в котором суммируется значение, но я не знаю, как напечатать значения групп.

use strict;
use warnings;
use Data::Dumper;
my $file=shift;
open (DATA, $file);
my %score_by_year;

while ( my $line = <DATA> )
{
        my ($protein, $year, $score) = split /\s+/, $line;
        $score_by_year{$year} +=$score;
        print "$protein\t$year\t$score_by_year{$year}\n";
}
close DATA;

поэтому мой код выдает:

b1  1995    1
b1  2007    0.1
b2  1974    0.1
b2  1974    0.7
b2  1975    0.3

тогда как ожидаемый результат будет таким:

b1  1995    1
b1  2007    0.1
b2  1974    0.7
b2  1975    0.3

1 Ответ

1 голос
/ 24 мая 2019

Чтобы сохранить последовательность, сохраните ее:

use strict;
use warnings;

my @sequence;
my %scores_by_year;

while (<DATA>) {
   my ($protein, $year, $score) = split;
   if (not exists $scores_by_year{$protein}{$year}) {
     push @sequence, [$protein, $year];
   }
   $scores_by_year{$protein}{$year} += $score;
}

for my $protein_year (@sequence) {
  my($protein, $year)= @$protein_year;
  print join("\t", $protein, $year, $scores_by_year{$protein}{$year}), "\n";
}
__DATA__
b1  1995    1
b1  2007    0.1
b2  1974    0.1
b2  1974    0.7
b2  1975    0.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...