如何将 150 1536 孔板中的值压缩为 perl 中每个坐标的一个值

发布于 2024-11-14 09:40:46 字数 1063 浏览 1 评论 0原文

我有 150 个 32 x 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}{$coords}[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 个值。有谁知道我做错了什么?谢谢

I have 150 32 by 48 matrices of values that represent color intensities from images of yeast plates. I would like to take for example coordinate (x,y) from each plate generate an average and then create a new plate out of that. Right now I have all of the values in a file in the following format:

  • 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

The first group represents the plate name the second the x,y coordinates and the third the z-score value.

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;

}

I have created a hash $stats{$long_name}{$coords}[0] to store the values
I then created a loop to try to gain access to those values:

foreach $long_name ( sort keys %stats ) {

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

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

        }

}

However I am doing something wrong because when I try to divide the total by 150 being the number of unique values in $long_name I am not left with 1536 values. Does anyone know what I am doing wrong? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山川志 2024-11-21 09:40:46

也许我误解了你想要的。我认为你想要一个“平均”板,其中 0,0 是所有 150 个板的 0,0 值的平均值,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 个车牌,你可以这样做 $coords_average{$coords} += $zscores / 150; 在初始循环中。)

Maybe I'm misunderstanding what you want. I think you want an "average" plate, where 0,0 has the average of the 0,0 values of all 150 plates, 0,1 has the average of the 0,1 values, etc.

If so, you don't want a hash by long name, you want just a hash by coords:

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;

(Assuming an arbitrary number of plates; if you always want to assume 150 plates, you can just do $coords_average{$coords} += $zscores / 150; in the initial loop.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文