Perl:将哈希数组转换为矩阵

3
我有一个哈希数组,其中许多哈希具有共享键。
我想将其转换为矩阵以在[R]中进行分析,使每行表示一个哈希,每个唯一的键是一列,如果哈希不包含该特定键,则为空白或'.'或'NA'。
目前,我计划在哈希数组中找到每个唯一的键,并通过循环遍历每个哈希来构建我的矩阵...但一定有更好的方法吧?
谢谢!
例子:
my %hash_A = (
  A=> 12,
  B=> 23,
  C=> 'a string'
  );
my %hash_B = (
  B=> 23,
  C=> 'a different string',
  D=> 99
  );

提供:

A,B,C,D
12,23,'a string',NA
NA, 23, 'a different string', 99

1
你能展示一下你的数据结构和期望的输出的小例子吗? - dgw
我不是PDL的用户,但这似乎是那种该组经常需要做并且有简单方法完成的事情。 - Joe
3个回答

2
如果你确保每个哈希都初始化为每个可能的键的“NA”,那么你基本上有一个矩阵,可以直接打印出来...(当数据不是“NA”时,它应该被覆盖)。
如果无法初始化它们,则在打印数据结构时保留所有可能的键的跟踪,而不是遍历每个单独哈希的键。
my @possibleKeys = keys %possibleKeys;
foreach my $hashref (@arrayOfHashes)
    foreach my $key (@possibleKeys) {
        if(!defined ${$hashref}{$key}) { 
            print "NA "; 
        else { 
            print "$hashref{$key} "; 
        }
    print "\n"; 
    }
}
编辑: keys %possibleKeys将为每次调用返回不同顺序的数组(参见http://perldoc.perl.org/functions/keys.html),因此应将键存储在数组中以保留顺序。

1
my @a = ( keys %hash_A, keys %hash_B );
my %r;
@r{@a} = @a;
for my $h ( \%r, \%hash_A, \%hash_B ) {
    print join( ', ', map { $$h{$_} ||= 'NA' } sort keys %r ), "\n";
}

1

这应该将哈希数组转换为2D数组(@output1)。

所有没有相应输入值的输出单元格都将填充为'NA'。(如果您不介意未映射的单元格被映射到undef,则可以更简洁地完成此操作 - 参见@output2。)

数组@keys将说出每个输出行中的索引位置对应哪个哈希键。

my @array_of_hashes = ...;

my %keys

for my $hash (@array_of_hashes) {
    @keys{keys %$hash} = ();
}

my @keys = sort keys %keys;

my @output1 = map {
    my $hash = $_;

    [ map { exists $$hash{$_} ? $$hash{$_} : 'NA' } @keys ];
} @array_of_hashes;

my @output2 = map [ @$_{@keys} ] => @array_of_hashes;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接