0

私は各配列が次のような配列の配列を持っています:

clusterA gene1 1
clusterA gene2 0
clusterB gene1 1
clusterB gene2 0

次のようなファイルを作成したい:

name       gene1    gene2 
clusterA    1         0
clusterB    1         0

現在の試み:

if (condition) {

    @array = ($cluster, $genes, "1");
}
elsif (not condition) {

    @array = ($cluster, $genes, "0");
}
push @AoA, [ @array ];  

@A0Aは私の配列の配列です。

4

4 に答える 4

0
use warnings;
use strict;

my @AoA = ( ['a', 'b', 'c'], ['d', 'e', 'f'] );

open my $outf, ">", "output"
    or die();

print $outf join(" ", qw/name gene1 gene2/), "\n";
foreach my $arr (@AoA) {

    my @data = @{$arr};
    print $outf join(" ", @data), "\n";
}
close $outf;
于 2012-09-02T11:34:41.843 に答える
0
my %HoH;

foreach my $row (@AoA)
{
  $HoH{$row->[0]}{$row->[1]} = $row->[2];
}

print <<EOF;
name       gene1    gene2
clusterA    $HoH{clusterA}{gene1}         $HoH{clusterA}{gene2}
clusterB    $HoH{clusterB}{gene1}         $HoH{clusterB}{gene2}
EOF
于 2012-09-02T12:29:05.303 に答える
0

シャキールは合計が欲しかったですか?その場合、答えは次のようになります(テストを簡素化するためにすべてのファイルI / Oを除外します):

my @AOA = (
  [ qw(clusterA gene1 1) ],
  [ qw(clusterA gene2 0) ],
  [ qw(clusterB gene1 1) ],
  [ qw(clusterB gene2 0) ],
);

my %clusters;
my @genes = ( 0, 0 );

foreach my $array ( @AOA ) {

    my ( $cluster, $gene, $value ) = @$array;
    if ( $gene =~ /^gene(\d+)$/ ) {

        my $v = $1; 
        $clusters{$cluster} = [ 0, 0 ] 
                   unless ( exists $clusters{$cluster} );
        $clusters{$cluster}->[$v-1] += $value;
    }   
}

my $format = '%-12s %6s %6s'."\n";
printf( $format, qw( name gene1 gene2 ) );

foreach my $cluster ( sort keys %clusters ) {

    printf $format, $cluster, @{ $clusters{$cluster} };
}
于 2012-09-02T12:33:28.017 に答える
0

このソリューションは、遺伝子の名前を事前に知りません。表示されたすべての遺伝子の列が作成されます。そして、それはハッシュのハッシュを使用します。私は同様の問題を解決し、ここで解決策の同じ部分のいくつかを使用することができました。

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

my @array = map [split], split /\n/, <<EOF;
clusterA gene1 1
clusterA gene2 0
clusterB gene1 1
clusterB gene2 0
clusterC gene3 9
EOF

my %data;
for my $aref (@array) {
    $data{$aref->[0]}{$aref->[1]} = $aref->[2]; 
}

my %seen;
my @genes = sort
            grep ! $seen{$_}++,
            map keys %$_, values %data;

my $format = "%-15s" . "%-10s" x @genes . "\n";

printf $format, 'Cluster', @genes;

for my $name (sort keys %data) {
    my $href = $data{$name};
    printf $format, $name, map defined $_ ? $_ : 'none', @$href{ @genes };
}

これにより、以下の出力が生成されました。

Cluster        gene1     gene2     gene3
clusterA       1         0         none
clusterB       1         0         none
clusterC       none      none      9

更新:配列の配列の代わりに、最初にハッシュのハッシュを作成する方がおそらく簡単でしょう。好き:

my %data;
$data{$cluster}{$genes} = condition ? 1 : 0;
于 2012-09-02T15:38:36.323 に答える