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

该解决方案不提前知道基因的名称。它将为所有看到的基因创建列。而且,它使用散列的散列。我解决了一个类似的问题,并且能够在此处使用解决方案的某些相同部分。

#!/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 回答
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
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

沙克想要总数吗?如果是这样,答案将更像(将所有文件 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 回答