我有一个公司ID和日期列表,我希望在这个列表上运行一个宏,这样每个日期都需要将所有公司ID都视为我的宏过滤器。
例如,我的列表是 -
DATA comp_date_list;
INPUT compno sdate;
DATALINES;
12490 20090120
87432 20090120
24643 20090120
87432 20090119
12490 20090105
24643 20090105
;
proc print data=comp_date_list;
run;
现在,我有一个如下的宏 -
%macro1(compno=,sdate=,threshold=,fdate=,edate=)
现在,宏必须为列表中的每个comp-date组合运行。但由于这是在非常大的数据集上运行,因此运行n次需要很长时间。因此,为了减少运行时间,我计划为给定日期创建一个compnos列表并更改我的宏以生成日期的结果。
现在我的问题是如何创建一个宏变量,其中包含给定日期的所有compnos,并且会更改为日期更改?我是宏写作和SAS的新手。请原谅我的无知。谢谢!
答案 0 :(得分:1)
datastep中的call execute
语句可以在调用它的datastep之后运行选择性代码(在本例中为宏)。例如,以下内容适用于您: -
proc sort data = comp_date_list;
by sdate compno;
data _null_;
set comp_date_list;
by sdate;
attrib all_comps_on_date length=$1000 label="All_comps_on_date: '|' separated company numbers for date";
retain all_comps_on_date "";
if first.sdate then all_comps_on_date = '';
all_comps_on_date = catx('|', all_comps_on_date, compno);
if last.sdate then call execute('%macro1(compno='||strip(all_comps_on_date)||',sdate=,threshold=,fdate=,edate=)');
run;
但请注意; call execute
可以对自己创建宏变量的宏造成严重破坏(特别是如果他们正在使用call execute
语句!)
我只能回应@ChrisJ并补充一点,虽然SAS宏很有用,维护和调试它们很痛苦,我只把它们作为最后的手段。当然对遗留代码没什么帮助!