如何编写扫描存储在SAS数据集中的查找表的宏?

时间:2014-07-30 20:04:49

标签: macros sas

我有一个非常短(<20行)的数据集,如下所示:

Effective_Date  Pct
--------------  ---
01JAN2000       50%
...
11FEB2014       55%
13JUL2014       65%

我想写一个带有日期Eval_Date的宏,并返回在该日期生效的Pct。为了清楚起见,我知道这可以通过某种PROC SQL构造来完成,但我想编写一个可以在数据步骤中使用的函数式宏。

例如,%pct('12jul2014'd)应评估为55%

1 个答案:

答案 0 :(得分:3)

假设您的源数据集是effpct且pct是数字格式,格式为percent.,请使用它来创建包含每天和有效百分比的格式:

/* Merge without a by statement, using firstobs=2 to do a look-ahead join to 
   determine the 'effective to' date */

data pct_fmt ;
  retain fmtname 'EFFPCT' type 'N' ;
  merge effpct
        effpct (firstobs=2 keep=effective_date rename=(effective_date=to_date)) ;

  if missing(to_date) then to_date = date() ; /* Take last record up to current date */

  do start = effective_date to (to_date - 1) ;
    label = pct ;
    output ;
  end ;
run ;
/* 'Compile' the format */
proc format cntlin=pct_fmt ; run ;

/* Abstract put(var,format) into a function-style macro */
%MACRO PCT(DT) ;
  put(&DT,EFFPCT.) ;
%MEND ;

/* Then use it in a datastep... */
data want ;
  input date date9. ;
  eff_pct = %PCT(date) ;
  format eff_pct percent9. ;
datalines ;
01JAN2000
13FEB2014
20JUL2014
;
run ;

或者,使用%SYSFUNCputn可以将日期转换为datastep之外的百分比,例如在title声明中:

%MACRO PCT2(DT) ;
  %SYSFUNC(putn(%SYSFUNC(putn(&DT,EFFPCT.)),percent.))
%MEND ;

title "The effective pct on 09JUL2013 was %PCT2('09jul2013'd)" ;