【问题标题】:Perl count frequency of keys in hashPerl计算哈希键的频率
【发布时间】:2020-03-20 04:23:55
【问题描述】:

我已经从多维哈希中提取了第一级键,如下所示:

my @string = keys %hash;

print "@string\n";

Bacteroides fragilis (strain YCH46).Agrocybe aegerita (Black poplar mushroom) (Agaricus 
aegerita).Parabacteroides distasonis (strain ATCC 8503 / DSM 20701 / CIP 104284 / JCM 5825 / NCTC 
11152).Pelodictyon phaeoclathratiforme (strain DSM 5477 / BU-1).Clostridium kluyveri (strain NBRC 
12016).Torpedo marmorata (Marbled electric ray).Aethionema grandiflorum (Persian stone-cress).Conus 
consors (Singed cone).Saguinus labiatus (Red-chested mustached tamarin).Staphylococcus haemolyticus 
(strain JCSC1435).Aeromonas salmonicida (strain A449).Acinetobacter genomosp. 13.Staphylococcus 
aureus (strain USA300 / TCH1516).Loxosceles variegata (Recluse spider). and so on...

我正在尝试计算同一个有机体重复了多少次(我确定其中一些重复了很多次)。

我试过这段代码:

my %count;

foreach my $os (@string)  
{ 
$count{$os}++; 
} 


foreach my $os (sort keys %count)  
{ 
print $os, " ", $count{$os}, "\n";
} 

但我得到的输出就像所有只出现一次的生物一样,虽然我知道情况并非如此。

奇怪的是,当我尝试手动定义一个测试字符串并重复一些有机体时,代码可以正常工作。

我的哈希键发生了什么?

我可以在列表中单独访问它们,因此原则上它们定义明确......

有什么帮助吗?

已编辑:

当有机体是价值时的翻斗结构:

'ACYP_SYNJB' => {
                        '94' => 'Synechococcus sp. (strain JA-2-3B\'a(2-13)) 
(Cyanobacteria bacterium Yellowstone B-Prime).'
                      },
      'ACTM_STRPU' => {
                        '374' => 'Strongylocentrotus purpuratus (Purple sea 
urchin).'
                      },
      'A2ML1_HUMAN' => {
                         '1454' => 'Homo sapiens (Human).'
                       },
      'ACTP_SALDC' => {
                        '549' => 'Salmonella dublin (strain CT_02021853).'
                      },
      'ACBG2_XENLA' => {
                         '739' => 'Xenopus laevis (African clawed frog).'
                       },
      'ACO1_AJECA' => {
                        '476' => 'Ajellomyces capsulatus (Darling\'s disease 
fungus) (Histoplasma capsulatum).'
                      },
      'ACTM_PISOC' => {
                        '376' => 'Pisaster ochraceus (Ochre sea star) 
(Asterias ochracea).'
                      },
      '3MGH_RHOPB' => {
                        '200' => 'Rhodopseudomonas palustris (strain 
BisB18).'
                      }
    };

当按键时:

$VAR3585 = 'Geobacter sulfurreducens (strain ATCC 51573 / DSM 12127 / PCA).';
$VAR3586 = {
         'ACPS_GEOSL' => 126,
         'ACP_GEOSL' => 77,
         'ACKA_GEOSL' => 421,
         'ACYP_GEOSL' => 91,
         'ACCA_GEOSL' => 319
       };
$VAR3587 = 'Bactrocera dorsalis (Oriental fruit fly) (Dacus dorsalis).';
$VAR3588 = {
         'ACT3_BACDO' => 376,
         'ACT5_BACDO' => 376,
         'ACT1_BACDO' => 376,
         'ACT2_BACDO' => 376
       };
$VAR3589 = 'Caenorhabditis elegans.';
$VAR3590 = {
         'ACH5_CAEEL' => 511,
         '6PGD_CAEEL' => 484,
         'ACM2_CAEEL' => 627,
         'ACADM_CAEEL' => 417,
         'ADAL_CAEEL' => 388,
         'ACON_CAEEL' => 777,
         'ACBP3_CAEEL' => 116,
         '2AB1_CAEEL' => 495,
         '3HIDH_CAEEL' => 299,
         'ACH1_CAEEL' => 498,
         '6PGL_CAEEL' => 269,
         '2A51_CAEEL' => 542,
         '2AAA_CAEEL' => 590,
         'A16L2_CAEEL' => 534,
         'ACH4_CAEEL' => 548,
         'ACC2_CAEEL' => 445,
         'ADA17_CAEEL' => 686,
         'ACR5_CAEEL' => 598,
         'ACTL1_CAEEL' => 360,
         'ADBP1_CAEEL' => 217,
         'ACH8_CAEEL' => 474,
         '5NT3_CAEEL' => 376,
         'ACT2_CAEEL' => 376,
         'AAR2_CAEEL' => 357,
         'ACH23_CAEEL' => 545,
         'ACD11_CAEEL' => 617,
         'ABF2_CAEEL' => 85,
         'ABDH3_CAEEL' => 375,
         'ABF1_CAEEL' => 85,
         'ABH51_CAEEL' => 355,
         'ACX15_CAEEL' => 659,
         'ACC1_CAEEL' => 466,
         'ABL1_CAEEL' => 1224,
         'ACC3_CAEEL' => 517,
         'ABH52_CAEEL' => 444,
         'ACT4_CAEEL' => 376,
         'ACH2_CAEEL' => 493,
         'ACBP1_CAEEL' => 86,
         '14332_CAEEL' => 248,
         'ACR7_CAEEL' => 538,
         'ACC4_CAEEL' => 408,
         'ACE1_CAEEL' => 620,
         'AATC_CAEEL' => 408,
         'ACH6_CAEEL' => 502,
         'ACH3_CAEEL' => 564,
         'ACR3_CAEEL' => 487,
         'ACMSD_CAEEL' => 401,
         'ACH7_CAEEL' => 507,
         'ACR2_CAEEL' => 575,
         'ACASE_CAEEL' => 272,
         'ACM3_CAEEL' => 611,
         'AAPK2_CAEEL' => 626,
         'ACN1_CAEEL' => 906,
         '3HAO_CAEEL' => 281,
         'ADAS_CAEEL' => 597,
         'ACT1_CAEEL' => 376,
         'A4_CAEEL' => 686,
         'ADA10_CAEEL' => 922,
         'A16L1_CAEEL' => 578,
         'ACT3_CAEEL' => 376,
         'ACP1_CAEEL' => 426,
         'ACM1_CAEEL' => 713,
         'AAPK1_CAEEL' => 589,
         'ACOC_CAEEL' => 887,
         'ACLY_CAEEL' => 1106,
         '14331_CAEEL' => 248
       };
$VAR3591 = 'Anopheles stephensi (Indo-Pakistan malaria mosquito).';
$VAR3592 = {
         'ACES_ANOST' => 664
       };
$VAR3593 = 'Bacillus thuringiensis subsp. konkukian (strain 97-27).';
$VAR3594 = {
         'ACKA_BACHK' => 397,
         'ACCD_BACHK' => 289,
         'ACPS_BACHK' => 119,
         '3MGH_BACHK' => 205,
         'ACCA_BACHK' => 324,
         'ACP_BACHK' => 77
       };

更准确地说,我想知道哪些生物在我的哈希中具有超过 50 个蛋白质 ID,然后选择它们,摆脱蛋白质数量较少的其他生物

【问题讨论】:

  • 哈希键在定义上是唯一的,否则你有什么期望?
  • 你的意思是说“有机体”是一个可以在不同键中出现的词吗? (例如:一个有机体是fly,而键是some flyother fly ...)您从未向我们展示实际的键,而只是一个包含所有键的单词的数组。
  • 你能举出一个“有机体”的具体例子和它是“重复”的多个键吗?
  • 您的代码以my @string = keys %hash; 开头。但是由于%hash 不能有重复的键(重复定义将覆盖前一个)@string 不能有重复的条目。您的代码以错误的假设开始。如果您手动将重复条目放入@string,那么它可以工作。
  • “但是当我将它们定义为值时,我仍然没有得到好的结果。” - 请提供相关代码,因为您的意思并不完全清楚。一般来说,请提供足够的代码,以便其他人可以重现您的问题,而不仅仅是您认为重要的片段。

标签: string perl frequency


【解决方案1】:

更准确地说,我想知道哪些生物在我的哈希中具有超过 50 个蛋白质 ID,然后选择它们,摆脱蛋白质数量较少的其他生物

我不确定我是否完全理解了你的问题,但看起来你有以下类型的哈希:

my %hash = (
    'protein_id#1' => {
         'some-number' => 'organism-name'
    },
    'protein_id#2' => {
         'some-number' => 'same-or-other-organism-name',
    },
    ...
);

你想数一下有多少protein_id#X´ are for each differentorganism-name`。

在这种情况下,以下应该可以工作:

 my %organism;
 # "outer" hash has protein_id as key
 while (my ($protein,$h2) = each %hash) {
     # "inner" hash has organism-name as value
     # same organism could maybe be multiple times inside the same inner hash
     # but should only be counted once per protein_id
     my %organism;
     while (my ($some_number,$o) = each %$h2) {
         $organism{$o}++
     } 
     for (keys %organism) {
          $count{$_}++;
     }
 }

【讨论】:

  • 这为 %count 散列提供了每种生物体的蛋白质数量,是的,非常感谢。但是如何将每个动物的 %count 值应用为过滤程序,以仅打印具有超过 n 个(例如 50 个)蛋白质的所需生物体?我已经在这个问题上徘徊了很长时间,但无法得到正确的结果......就像在一个 foreach 中运行哈希的三个维度,打印键(protID 和 number(长度))和值(有机体) 如果 %count > 50 的值。
  • @EmilioMármolSánchez:您最初的问题要求计数。基于计数的过滤是另一个问题。但是可以通过类似的循环构造来完成,但这次不计数,而是根据先前的计数删除。请注意,在使用 each 对其进行迭代时,您不应该从哈希中删除,即,您要么收集需要收集并在迭代后删除的密钥,要么使用 for (keys ...) 对哈希进行迭代。
猜你喜欢
  • 2017-09-14
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2016-06-23
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多