Hello v15, and welcome to the Monastery!
I would suggest that you structure the main hash so that each gene name is keyed to an anonymous array of TF values. Then you can use the any function from List::Util to determine whether a given TF corresponds to a given gene:
#! perl use strict; use warnings; use List::Util qw( any ); my (%gene2TF2val, %TF); while (<DATA>) { my ($gene, $tf) = split; push @{ $gene2TF2val{ $gene } }, $tf; ++$TF{ $tf }; } # Print table header print "\t$_" for sort tf_sort keys %TF; print "\n"; # Print table contents for my $gene (sort keys %gene2TF2val) { # Print one line print $gene; for my $tf (sort tf_sort keys %TF) { print "\t", (any { $_ eq $tf } @{ $gene2TF2val{$gene} }) ? '+' : '-' +; } print "\n"; } sub tf_sort { my ($pre_a, $num_a) = $a =~ /^(\D+)(\d+)/; my ($pre_b, $num_b) = $b =~ /^(\D+)(\d+)/; return $pre_a cmp $pre_b || $num_a <=> $num_b; } __DATA__ geneA T1 geneA T1 geneA T2 geneB T8 geneC T10 geneC T1
Output:
16:28 >perl 1585_SoPW.pl T1 T2 T8 T10 geneA + + - - geneB - - + - geneC + - - + 16:30 >
(The trickiest part is writing the custom sort routine tf_sort to ensure that “T10” comes after “T8” — see sort.)
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
In reply to Re: transforming a table
by Athanasius
in thread transforming a table
by v15
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |