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_。
网友评论