【问题标题】:Perl: Transform an array of hashes into a matrixPerl:将哈希数组转换为矩阵
【发布时间】:2012-01-23 20:54:52
【问题描述】:

我有一个哈希数组,其中许多都有共享键。

我想把它转换成一个矩阵在[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

【问题讨论】:

  • 您能否展示一个关于您的数据结构和所需输出的小示例?
  • 我不是PDL 用户,但这似乎是我认为该组必须经常做的事情,并且有一个简单的方法。

标签: perl r hash matrix


【解决方案1】:

如果您确保每个可能的键的每个哈希都初始化为“NA”,那么您基本上有一个矩阵,您可以将其打印出来......(当它不是“NA”时,数据应该被覆盖")

如果您无法初始化它们,那么只需事先跟踪所有可能的键,然后在打印您的数据结构时循环它们(而不是遍历每个单独哈希的键)。

我的@possibleKeys = 键 %possibleKeys; foreach 我的 $hashref (@arrayOfHashes) foreach 我的 $key (@possibleKeys) { if(!defined ${$hashref}{$key}) { 打印“NA”; 别的 { 打印“$hashref{$key}”; } 打印“\n”; } }

编辑: keys %possibleKeys 将为每次调用返回不同顺序的数组(参见 http://perldoc.perl.org/functions/keys.html),因此键应存储在数组中以保持顺序。

【讨论】:

    【解决方案2】:

    这应该将散列数组转换为二维数组 (@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;
    

    【讨论】:

      【解决方案3】:
      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";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 2014-07-23
        • 2019-10-27
        • 2019-05-23
        • 2012-10-29
        • 2012-11-11
        • 2021-07-13
        • 1970-01-01
        相关资源
        最近更新 更多