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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.