Как сконденсировать значения из 150 1536 скважинных пластин в одно значение на координату в perl - PullRequest
1 голос
/ 06 июня 2011

У меня есть 150 32 на 48 матриц значений, которые представляют интенсивность цвета из изображений дрожжевых пластинок. Я хотел бы взять, например, координаты (x, y) для каждой пластины, получить среднее значение, а затем создать новую пластину из этого. Прямо сейчас у меня есть все значения в файле в следующем формате:

  • EA_D01_5-8 30,22 -0,397914165526517

  • EA_D01_5-8 30,23 -0,326759277147352

  • EA_D01_5-8 31,22 -0,172657520010773

  • EA_D01_5-8 31,23 -0,103405885199075

Первая группа представляет имя пластины, вторая - координаты x, y, а третья - значение z-показателя.

while($line = <DATAFILE>){                 
     chomp($line); 
     my @temp = split(/\t/, $line);
     $long_name = $temp[0];
     $coords = $temp[1];
     $zscores = $temp[2];
     $stats{$long_name}{$coords}[0] = $zscores;

}

Я создал хеш $ stats {$ long_name} {$ordins} [0] для хранения значений Затем я создал цикл, чтобы попытаться получить доступ к этим значениям:

foreach $long_name ( sort keys %stats ) {

        foreach $coords( keys %{$stats{$long_name}} ){

                my $zscoreV = $stats{$long_name}{$coords}[0];
                $totalV = $totalV + $zscoreV;

        }

}

Однако я делаю что-то не так, потому что, когда я пытаюсь разделить сумму на 150, являющуюся числом уникальных значений в $ long_name, у меня не останется 1536 значений. Кто-нибудь знает, что я делаю не так? Спасибо

1 Ответ

4 голосов
/ 06 июня 2011

Может быть, я неправильно понимаю, что вы хотите.Я думаю, что вы хотите «среднюю» пластину, где 0,0 имеет среднее значение 0,0 для всех 150 пластин, 0,1 имеет среднее значение 0,1 и т. Д.

ЕслиИтак, вам не нужен хеш с длинным именем, вам нужен просто хэш с координатами:

my %coords_total;
my %coords_count;
while(my $line = <DATAFILE>) {
    chomp($line); 
    my ($long_name, $coords, $zscores) = split(/\t/, $line);
    $coords_total{$coords} += $zscores;
    $coords_count{$coords}++;
}

my %coords_average = map $coords_total{$_} / $coords_count{$_}, keys %coords_total;

(Предполагая произвольное количество пластин; если вы всегда хотите принять 150 пластин, вы можетеdo $coords_average{$coords} += $zscores / 150; в начальном цикле.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...