SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1511|回复: 6
打印 上一主题 下一主题

请教关于HASH对象中的CALL MISSING

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-12-19 11:02:29 | 只看该作者

请教关于HASH对象中的CALL MISSING

data Members;
        length Member_id $7 Plan_id $3 Group_id $4;
        input Member_id $ Plan_id $ Group_id $;
datalines;
164-234 XYZ G123
297-123 ABC G123
344-123 JKL G456
395-123 XYZ G123
495-987 ABC G456
562-987 ABC G123
697-123 XYZ G456
;

data Plans;
  length Plan_id $3 Plan_desc $20;
  input Plan_id $ Plan_desc & $;
datalines;  
XYZ  HMO Salaried   
ABC  PPO Hourly
XXX  AAAAAA
;

data both2;
if _n_=0 then set plans;
   if _n_ = 1 then do;
    declare hash h(dataset:'chapt12.plans');
    h.definekey('Plan_id');
    h.definedata('Plan_desc');
    h.definedone();
  end;
   set members;
   call missing(Plan_desc);

  if h.find() = 0 then
    output;

run;

本以为数据both2在使用call missing语句后有7条观测,但不是这样,请高手赐教!如果按照下面这样写,就是7条观测:
data both1(drop=rc);     
  declare Hash Plan ();   
   rc = plan.DefineKey ('Plan_id');  
   rc = plan.DefineData ('Plan_desc');  
   rc = plan.DefineDone ();   
   do until (eof1) ;      
     set plans end = eof1;
     rc = plan.add ();     
  end;
  do until (eof2) ;  
     set members end = eof2;
     call missing(Plan_desc);
     rc = plan.find ();  
     output;   
  end;
  stop;
run;

多谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-12-19 11:45:23 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

[quote:1uivynia]本以为数据both2在使用call missing语句后有7条观测,但不是这样[/quote:1uivynia]
仅供参考,不一定对:
1、call missing()好象一般放在hash object的初始化之后,以避免出现NOTE信息(报变量未初始化)
2、观测的输出条数好象和IF语句的OUTPUT有关,跟call missing()无关
[code:1uivynia]data both2;
        length Plan_id $3 Plan_desc $20;
        if _n_ = 1 then do;
                        declare hash h(dataset:'plans');
                        h.definekey('Plan_id');
                        h.definedata('Plan_desc');
                        h.definedone();
                        call missing(plan_id,plan_desc);
                end;
        set members;
        rc=h.find();
        /*if rc=0 then output; */
run;[/code:1uivynia]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-19 12:19:16 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

的确是这样,如果加了if rc=0 then output;会把rc<>0的一条观测去掉了。多谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-19 12:26:56 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

不过,有一个细节非常有意思,下面两段程序居然返回不一样的结果,不知道IF 0 和LENGTH在PDV里面有什么不一样:
data both2;
   length plan_id $3 plan_desc $20;
   if _n_ = 1 then do;
         declare hash h(dataset:'chapt12.plans');
         h.definekey('plan_id');
         h.definedata('plan_desc');
         h.definedone();
         call missing(plan_desc);
      end;
   set chapt12.members;
   rc=h.find();
run;

data both22;
   if 0 then set chapt12.plans;
   if _n_ = 1 then do;
         declare hash h(dataset:'chapt12.plans');
         h.definekey('Plan_id');
         h.definedata('Plan_desc');
         h.definedone();
         call missing(plan_desc);
      end;
   set chapt12.members;
   rc=h.find();
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-19 13:13:11 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

[color=#FF0000:3igkme6f]CAUTION [/color:3igkme6f]:以下都是忽悠的,我不对此承担法律责任
[quote:3igkme6f]length plan_id $3 plan_desc $20;[/quote:3igkme6f]
length语句主要是把变量plan_desc声明为character,否则hash object会把它当做numeric的而在执行阶段报错
[quote:3igkme6f]if 0 then set chapt12.plans;[/quote:3igkme6f]
这个东东比较怪,我没这么用过,不过好象虽然if 0不会实际的SET数据,但它能在PDV中开出变量的空间。如果这么理解没错的话,由于plan_id和plan_desc是从sas data set中来的,因此是retain的,所以JKL的plan_desc值不为缺失,而retain了上条记录的值
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-12-19 13:39:20 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

以前一直喜欢用IF 0,看来在HASH里面要小心了,anyway,多谢帮助!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-12-21 01:43:50 | 只看该作者

Re: 请教关于HASH对象中的CALL MISSING

[quote:nnxg4npc]...在PDV中开出变量的空间。如果这么理解没错的话,由于plan_id和plan_desc是从sas data set中来的,因此是retain的,所以JKL的plan_desc值不为缺失,而retain了上条记录的值.. [/quote:nnxg4npc]

很对啊。set 里的变量还有_n_等等都是自动retain的变量。而其他的,比如那些用length定义的,在一个程序的top implied loop都是要被先置做missing的。
对SAS的理解真是很深刻!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 09:44 , Processed in 0.067653 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表