美文网首页
SAS 程序冷知识——HASH连表报错的问题(merge下常见)

SAS 程序冷知识——HASH连表报错的问题(merge下常见)

作者: 生物统计与SAS研究员 | 来源:发表于2021-02-23 16:10 被阅读0次

    HASH方法是SAS中连表的重要方法之一,比merge和sql的方法更加灵活。但是在merge的过程中使用HASH方法有的时候会出现报错的情况。代码和错误如下:

    如图所示,这个错误的原因是在定义hash之前使用了if语句进行筛选了。在上面例子里导致错误的语句就是“if a;”,这本来是左连接的必要语句。具体的执行逻辑如下:

            在merge的时候,_n_这个 “自动变量的数值不等于最终生成的数据集的行号”。_n_的值是在PDV执行的最开始就已经赋值完成的,这意味着 “_n_的值=if筛选前的行号”。因此按照上例来说,当连接键usubjid的第一个值(整体最小值),在两个数据集中都存在,或者在CM中有的时候,第一行是满足 变量a的值为1的,从而这一行不会因为 "if a;"语句被筛除掉,导致后面的 “if _n_=1 then do;。。。。。”无法执行,因此也就不会报错。但如果连接键usubjid的第一个值,在CM中没有,在adsl中有的话,第一行数据因为只来自adsl,所以不满足"if a;"语句的条件,从而跳过执行后面的 “if _n_=1 then do;。。。。。”。但问题在于定义hash的语句只会在第一行执行一次,而第一行又因为不满足"if a;"语句没有实际执行,这就导致整个程序因为没有定义HASH而报错。

            具体的解决办法有几种:

    1、把“if a;”语句放到hash定义之后(不一定放在find()方法的后面)。

    2、在“if a;”的后面, “if _n_=1 then do;。。。。。”的前面,加上一句“m+1;”。然后把 “_n_=1” 换成“m=1”。这个方法实质上就是用另一个变量作为 “最终生成的数据集的行号”,来替换作为 “if筛选前的行号” 的_n_

    相关文章

      网友评论

          本文标题:SAS 程序冷知识——HASH连表报错的问题(merge下常见)

          本文链接:https://www.haomeiwen.com/subject/gjgrfltx.html