我有一个包含冗余列表的输入,如下所示:
Sample1.14 Water
Sample2.45 Air
Sample1.16 Dirt
Sample1.14 Water
Sample2.45 Air
Sample1.16 Dirt
Sample1.14 Water
Sample2.45 Air
Sample1.16 Dirt
Sample1.16 Dirt
Sample1.14 Dirt
Sample2.45 Air
Sample1.16 Air我创建了一个散列,计算每个样本给出结果的频率--水、空气、污垢(注意,这只是示例数据,但结构是相同的)。
use warnings;
use strict;
my $inPut = "ExampleSample";
open(READ,$inPut) || die "Coult not read $inPut: $!";
my %sampleHash;
while (<READ>) {
chomp;
my @temp = split("\t",$_);
my $sample = $temp[0];
my $type = $temp[1];
$sampleHash{$type}{$sample} += 1;
}它按预期工作,并作为输出提供:
$VAR1 = {
'Dirt' => {
'Sample1.16' => 4,
'Sample1.14' => 1
},
'Air' => {
'Sample1.16' => 1,
'Sample2.45' => 4
},
'Water' => {
'Sample1.14' => 3
}
};由于这是安静的,一个糟糕的数据结构,更深层次的东西,我想把这个数据放在一个矩阵,我有点迷失了。
所需的输出或此示例的转位并不重要:
Sample1.14 Sample2.45 Sample1.16
Air 0 4 1
Dirt 4 0 4
Water 3 0 0我真的被困在这里了,任何帮助都是非常感谢的!谢谢。
发布于 2017-04-13 13:29:53
您可以将散列散列“咀嚼”到数组中,然后将其输入到Acme::工具::透视()或数据::枢轴::透视()中。如下所示:
use Acme::Tools;
my $data={
'Dirt' => {
'Sample1.16' => 4,
'Sample1.14' => 1
},
'Air' => {
'Sample1.16' => 1,
'Sample2.45' => 4
},
'Water' => {
'Sample1.14' => 3
}
};
my @sample=uniq(sort map keys(%$_), values %$data);
my @element=sort keys %$data;
my $data2=[ map { my $x=$_; map [$x,$_,$$data{$x}{$_}||' 0'], @sample } @element ];
print tablestring([Acme::Tools::pivot($data2,"Element")]);输出:
Element Sample1.14 Sample1.16 Sample2.45
------- ---------- ---------- ----------
Air 0 1 4
Dirt 1 4 0
Water 3 0 0https://stackoverflow.com/questions/43255121
复制相似问题