SAS中文论坛

标题: 请问变量在数据步和宏之间的数值传递 [打印本页]

作者: shiyiming    时间: 2006-5-18 12:41
标题: 请问变量在数据步和宏之间的数值传递
刚刚上手SAS, 这两天被搞的焦头烂额。

比如说下面:
Data _NULL_;
set a;
retain cc 1;
%deliver;

%Macro deliver;
data _NULL_;
set b;
put cc;
%Mend deliver;
run;
如果这样的话宏里面的cc是没有值的, 数据部的cc=1的值是不会传到宏里面去的.



但是写成
Data _NULL_;
set a;
retain cc 1;
%deliver;

%Macro deliver;
put cc;
%Mend deliver;
run;
这样就可以把cc=1列印出来. 所以我很奇怪究竟是怎么回事.



其实问题的关键是我有两个dataset, set a 和set b, 两个dataset是相关联的. 我想在set a中取值后再在set b中定位相同值的records, 再把这些records放在set c中, 我只想到用宏这样的笨方法. 有没有什么其它方法? 一定要用sql一类的东西?
谢谢.
作者: shiyiming    时间: 2006-5-18 15:13
标题: @
i think sql is the simplest way.

[code:03c48]data a;
input id$ x;
cards;
a1 12
a2 23
;
run;

data b;
input id$ y;
cards;
b1 12
b2 99
b3 45
;
run;

proc sql;
create table c as select * from a ,b
where a.x=b.y;
quit;[/code:03c48]
作者: shiyiming    时间: 2006-5-18 18:19
标题: 执行时间
你没有搞明白两个问题,一个是数据步的执行时机,另外一个是宏执行时机。
作者: shiyiming    时间: 2006-5-22 23:48
标题: RE
(1) "究竟是怎么回事 数据部的cc=1的值是不会传到宏里面去的"
       Because  宏里面有 <data _NULL_;> which causes a seperated data steps.  The 宏 can be changed to as below

%Macro deliver;
set b;
put cc;
%Mend deliver;


(2)其它方法 to join datasets by 定位相同值的records only.

data c;
  set a;
  set b;
  retain cc 1;
run;
作者: shiyiming    时间: 2006-5-23 00:05
标题: RE
By the Way, forgot to mention that making宏statement  should be moved to before its 执行时机.




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2