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