0

次のデータがあります。

eya XLOC_000445_Change:10.3_q:0.003 atonal1
six XLOC_00099_Change:70.0_q:0.095  atonal1
six-eya XLOC_0234324_Change:19.8_q:0.05 atonal1
eya XLOC_00010_Change:6.5_q:0.22    c-myc
six XLOC_025437_Change:1.1_q:0.018  c-myc
six-eya XLOC_001045_Change:2.3_q:0.0001 c-myc
eya XLOC_000115_Change:7.3_q:0.03   ezrin
six XLOC_000001_Change:7.9_q:0.00006    ezrin
six-eya XLOC_0234322_Change:9.0_q:0.0225    ezrin
six-eya XLOC_091345_Change:9.3_q:0.005  slc12a2
eya XLOC_000445_Change:9.9_q:0.3    atonal1
six XLOC_00099_Change:7.0_q:0.95    atonal1
six-eya XLOC_0234324_Change:9.8_q:0.5   atonal1

そして、次のようにHoHoAを構築しようとしました:

#!/usr/bin/perl
use warnings;
use strict; 

方法 1: 配列値を HoH にプッシュする:

while (<$input>) { 
    chomp;
    push @xloc, $1 if ($_ =~ /(XLOC_\d+)/);
    push @change_val, $1 if ($_ =~ /Change:(-?\d+\.\d+|-?inf)/);
    push @q_value, $1 if ($_ =~ /q:(\d+\.\d+)/);
    my @split = split('\t');            
    push @condition, $split[0];
    push @gene, $split[2];
}           
push @{ $experiment{$gene[$_]}{$condition[$_]} }, [ $xloc[$_], $change_val[$_], $q_value[$_] ] for 0 .. $#change_val;

方法 2: オンザフライで HoHoA に値を割り当てる:

while (<$input>) { 
    chomp;
    my $xloc = $1 if ($_ =~ /(XLOC_\d+)/);
    my $change = $1 if ($_ =~ /Change:(-?\d+\.\d+|-?inf)/);
    my $q_value = $1 if ($_ =~ /q:(\d+\.\d+)/);
    my @split = split('\t');
    my $condition = $split[0];
    my $gene = $split[2];
    $experiment{$gene}{$condition} = [ $xloc, $change, $q_value ];
}

私が望むデータ構造を得る限り、どちらもうまくいきます。ただし、重複として存在する遺伝子 (この場合atonal1は ) が HoHoA で 2 回表されることを保証するのは、最初の方法 (プッシュ) のみです。

私のダウンストリーム コードはもともと、2 番目の方法でビルドされた HoHoA を処理するために作成されたものであり、次のコードで両方のアプローチが異なる方法で処理される理由を、私の人生では理解できません。

ダウンストリーム コード:

my (%change, %seen, $xloc, $change_val, $q_value);
for my $gene (sort keys %experiment) {
     for my $condition (sort keys %{$experiment{$gene}}) {
         $seen{$gene}++; # Counts for each occurrence of gene 
         if ( (not exists $change{$gene}) || (abs $change{$gene} < abs $experiment{$gene}{$condition}[1]) ) { # Has a larger change value
             $change{$gene} = $experiment{$gene}{$condition}[1];
         }               
    }
}
print Dumper \%change;

上記のコードをいずれかのアプローチで実行すると、次のようになります。

方法 1の出力:

$VAR1 = {
          'atonal1' => [
                         'XLOC_0234324',
                         '9.8',
                         '0.5'
                       ],
          'c-myc' => undef,
          'ezrin' => undef,
          'slc12a2' => undef,
        };

方法 2の出力:

$VAR1 = {
          'atonal1' => '9.9', # i.e. the largest change value for each condition/gene
          'c-myc' => '6.5',
          'ezrin' => '9.0',
          'slc12a2' => '9.3',
        };

私が欲しいのは:

$VAR1 = {
          'atonal1' => [
                          '9.9',
                          '70.0' # This is the difference - i.e the both values are added to the hash `%change`
                       ], 
          'c-myc' => '6.5',
          'ezrin' => '9.0',
          'slc12a2' => '9.3',
        };

何が違いを生んでいるのかわからない

アップデート

方法 1%experimentを使用して値がプッシュされた後の Dumper 出力を投稿します。

$VAR1 = {
          'atonal1' => {
                         'eya' => [
                                    [
                                      'XLOC_000445',
                                      '10.3',
                                      '0.003'
                                    ],
                                    [
                                      'XLOC_000445',
                                      '9.9',
                                      '0.3'
                                    ]
                                  ],
                         'six' => [
                                    [
                                      'XLOC_00099',
                                      '70.0',
                                      '0.095'
                                    ],
                                    [
                                      'XLOC_00099',
                                      '7.0',
                                      '0.95'
                                    ]
                                  ],
                         'six-eya' => [
                                        [
                                          'XLOC_0234324',
                                          '19.8',
                                          '0.05'
                                        ],
                                        [
                                          'XLOC_0234324',
                                          '9.8',
                                          '0.5'
                                        ]
                                      ]
                       },
          'c-myc' => {
                       'eya' => [
                                  [
                                    'XLOC_00010',
                                    '6.5',
                                    '0.22'
                                  ]
                                ],
                       'six' => [
                                  [
                                    'XLOC_025437',
                                    '1.1',
                                    '0.018'
                                  ]
                                ],
                       'six-eya' => [
                                      [
                                        'XLOC_001045',
                                        '2.3',
                                        '0.0001'
                                      ]
                                    ]
                     },

          'ezrin' => {
                       'eya' => [
                                  [
                                    'XLOC_000115',
                                    '7.3',
                                    '0.03'
                                  ]
                                ],
                       'six' => [
                                  [
                                    'XLOC_000001',
                                    '7.9',
                                    '0.00006'
                                  ]
                                ],
                       'six-eya' => [
                                      [
                                        'XLOC_0234322',
                                        '9.0',
                                        '0.0225'
                                      ]
                                    ]
                     },
          'slc12a2' => {
                         'six-eya' => [
                                        [
                                          'XLOC_091345',
                                          '9.3',
                                          '0.005'
                                        ]
                                      ]
                       },

        };
4

1 に答える 1