了解SAS哈希对象Keysum参数

了解SAS哈希对象Keysum参数,sas,Sas,浏览时,我可以阅读以下有关很少使用的Keysum参数的内容:它“指定跟踪所有键的键摘要的变量的名称。键摘要是一个键在FIND方法调用中被引用的次数计数。” 然而,玩弄它,这似乎有点不对劲。请考虑下面的小例子。如果文档是准确的,那么Keysum将等于测试数据集中的2(2*find()方法调用)。然而,它等于10 data _null_; declare hash h (suminc : 's', keysum : 'keysum'); h.definekey ('k'); h.d

浏览时,我可以阅读以下有关很少使用的Keysum参数的内容:它“指定跟踪所有键的键摘要的变量的名称。键摘要是一个键在FIND方法调用中被引用的次数计数。”

然而,玩弄它,这似乎有点不对劲。请考虑下面的小例子。如果文档是准确的,那么Keysum将等于测试数据集中的2(2*find()方法调用)。然而,它等于10

data _null_;
   declare hash h (suminc : 's', keysum : 'keysum');
   h.definekey ('k');
   h.definedone ();

   k = 1;
   s = 2;
   keysum = 0;

   h.add ();
   h.ref ();
   h.ref ();

   h.find ();
   h.find ();

   h.output (dataset : 'test');
run;
这是我自己的解释。每次Add()、Ref()或Find()方法引用键时,Keysum参数标记中指定的变量都会增加suminc变量的值。但必须至少存在一个find()方法调用才能执行增量。否则,Keysum不会递增(取出上面的两个find()方法调用并进行验证)

我的解释是简单地玩弄上面的代码

那么,我的解释和文档哪个更重要?

帮助条目比文档的其他部分更好地解释了这个概念。我的粗体

此SUMINC标记指示哈希对象分配内部存储以维护每个键的摘要值

每当使用ADD或REPLACE方法时,哈希键的摘要值被初始化为SUMINC变量的值

每当使用FIND、CHECK或REF方法时,哈希键的摘要值都会由SUMINC变量的值递增

请注意,SUMINC变量可以是负值、正值或零值。变量不需要是整数。默认情况下,键的SUMINC值为零

我不知道为什么通常近乎完美的文档团队不在关于SUMINC的其他不完整或不精确的声明之上

文档示例代码是非常漂亮的米老鼠,更好的SUMINC示例是:

  • 使用哈希计算加权频率表(输出数据集的freq为keysum)
  • 计算分类账报表中的运行总计。(使用
    .sum()
    检索总和)
  • 输出链接的金融交易总额(输出数据集的总额为keysum)
    • @Richard,谢谢你

      您同意对于初始化部分,Ref()方法也初始化Keysum的值吗?请参阅下面的代码

      data _null_;
         declare hash h (suminc : 's', keysum : 'keysum');
         h.definekey ('k');
         h.definedone ();
      
         k = 1;
         s = 2;
         keysum = 0;
      
         h.ref ();
      
         h.find ();
         h.find ();
      
         h.output (dataset : 'test');
      run;
      
      此外,必须存在Find()方法才能初始化和递增Keysum,这是否正确?例如,下面的输出数据集中的Keysum=0

      data _null_;
         declare hash h (suminc : 's', keysum : 'keysum');
         h.definekey ('k');
         h.definedone ();
      
         k = 1;
         s = 2;
         keysum = 0;
      
         h.add ();
      
         h.output (dataset : 'test');
      run;
      

      此外,我同意,提高文档中示例的复杂性会很好

      #1是的。使用
      .REF
      “将检查和添加方法合并到单个REF方法中”。。。“REF方法可用于计算哈希对象中每个键的出现次数。REF方法在第一次添加时初始化每个键的键摘要,然后在每次后续检查时更改添加。”--措词不当,但有点清楚。添加的更改可能应更改为更改关键摘要#2是。但是行为是意外的,因为只有
      add
      的步骤具有正确的内部和<代码>。。。h、 添加();h、 总和(总和:x);放x=日志
      x=2
      。那么为什么输出数据集的keysum=0呢?