全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4603 10
2014-12-09
悬赏 120 个论坛币 已解决
求助各位老师朋友一个Hash的问题,感觉很基础,但是我确实想不明白。

细节上是关于if 0 then set <dataset>;和普通length <vars>;的差异。

例如我就想做一个小表和大表的普通条件merge。

if a和b匹配上,就把b表中的d merge给大表a。

用length语句做声明,结果正确;用if 0 then set做编译,结果不正确。

感觉以前也这样用过不少,但是没发现问题,很奇怪。。
复制代码

最佳答案

老师她摸我 查看完整内容

1.LENGTH和IF 0 THEN SET都是定义变量的属性,区别在于LENGTH有个CALL MISSING,这是因为通常MAIN DATASET没有我们要MERGE的变量(D),所以要用一个CALL MISSING或者赋值语句来避免LOG中出现未初始化的提示。 2. 对于两种定义方法出现的结果不同,主要还得从PDV来理解,因为在HASH OBJECT中,如果没有匹配成功(H.FIND() NE 0), PDV中的MERGE变量(D)是不会重置的,这点与MERGE方法不同(BY GROUP一改变则PDV就重置),此时MER ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
-->
1.LENGTH和IF 0 THEN SET都是定义变量的属性,区别在于LENGTH有个CALL MISSING,这是因为通常MAIN DATASET没有我们要MERGE的变量(D),所以要用一个CALL MISSING或者赋值语句来避免LOG中出现未初始化的提示。
2. 对于两种定义方法出现的结果不同,主要还得从PDV来理解,因为在HASH OBJECT中,如果没有匹配成功(H.FIND() NE 0), PDV中的MERGE变量(D)是不会重置的,这点与MERGE方法不同(BY GROUP一改变则PDV就重置),此时MERGE变量的值就是最近一次MATCH成功的值了。个人习惯用IF 0 THEN SET这种方法来LOAD变量的属性,因为我们在没有匹配成功的时候,通常都要对MERGR变量(D)进行赋值(特定值或MISSING)。
所以在你的例子中,对于两种定义变量属性的方法,你只要在RC=H.FIND()前任意位置加上一个CALL MISSING(D),或者在RC=H.FIND()后对没有匹配的记录进行赋值(IF RC NE 0 THEN D=.)结果就一样了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-9 23:12:51
个人认为是由于set dataset中的变量实际上存在一个retain的作用,当你hash中找到对应key variables a b的时候,会把hash中的data part变量d返回到data部中,d 存在于set dataset中,所以会自动retain,当你碰到下次的hash key的时候,再次返回的值会将之前的d给覆盖掉,然后继续retain, 所以在用if 0 set时,要对没有找到key 时候,data part进行call missing处理
data c3;
/*  length a b d 8;*/
  if 0 then set b;
  if _n_ = 1 then do;
    dcl hash h(dataset:"b");
        h.definekey("a","b");
        h.definedata(all:'y');
        h.definedone();
        call missing(d);
  end;
  
  set a;
  if h.find() ne 0 then call missing(d);
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-10 00:25:18
Basically they do similar job. when using length , no need  call missing.
if using if 0 then set you need call missing.
in your code , you might put call missing (d) after if _n_=1 then do; end;
just call missing(d) before set a;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-10 08:42:12




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-12-10 10:15:14
Eternal0601 发表于 2014-12-9 23:12
个人认为是由于set dataset中的变量实际上存在一个retain的作用,当你hash中找到对应key variables a b的时 ...
谢谢。

比较赞同,昨天想了一下;if 0 then set时不需要用call missing,而length需要。

感觉上好像是length仅在data步编译时读取信息、而这个if 0 then set是在编译和每一步pdv执行时都在预读而不执行。

所以这个set句起到了retain作用,find()仅是做了个刷新作用。

这也是我的个人猜测。

另外我这真有点不知道,这以后假说用hash做merge,还怎么把hash的数据集信息铺垫在PDV中,难道是1by1的length进去。。这以后再也不敢愉快的使用hash来接dataset了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群