了解SAS哈希对象Keysum参数
浏览时,我可以阅读以下有关很少使用的Keysum参数的内容:它“指定跟踪所有键的键摘要的变量的名称。键摘要是一个键在FIND方法调用中被引用的次数计数。” 然而,玩弄它,这似乎有点不对劲。请考虑下面的小例子。如果文档是准确的,那么Keysum将等于测试数据集中的2(2*find()方法调用)。然而,它等于10了解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
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呢?