SAS中文论坛

标题: 紧急求助,编译器不一致引起的问题! [打印本页]

作者: shiyiming    时间: 2012-7-16 22:48
标题: 紧急求助,编译器不一致引起的问题!
在数据集ads中存放两个变量,一个是日期date,另一个是num.
是想计算针对每个和它的滞后一段时间的日期之间,对应的num的观测,计算平均值。
但是在计算滞后日期时,出了问题,curDate=date[i,1]是把当前(即date的第i个观测对应的日期)
赋值给curDate, %let lagDate= %sysfunc(intnx('day',curDate,-&width))是计算当前的滞后日期。
但是由于宏编译器是先执行的,此时curDate并没有被赋值,所以出错了。
怎样才能让他顺利执行呢?

各位高手有没有别的方式来做呢?恳请各位给予指点。

[code:2rqu1a7k]

data ads;
do i=1988 to 2012;
   do j=1 to 12;
      date=mdy(j,1,i);
          num=i*j;
          output;
   end;
end;
format date yymmdd10.;
keep date num;
run;

%let width=20;

%macro tt;

proc iml;

use ads;
read all into date;
close ads;

nrw=nrow(date);

datemx=date[,1];
nummx=date[,2];
firstdate=date[1,1];
lastdate=date[nrw,1];

do i=1 to nrw;
   curDate=date[i,1];
   %let lagDate= %sysfunc(intnx('day',curDate,-&width));
   
   dateloc=loc(&lagDate<=datemx & datemx<=curDate);
   numselect=nummx[dateloc];
   nummean=numselect[:,1];

end;
quit;

%mend tt;
%tt;
[/code:2rqu1a7k]
作者: shiyiming    时间: 2012-7-17 13:57
标题: Re: 紧急求助,编译器不一致引起的问题!
IML不熟悉……一般可以用call execute来使运行到当前步再编译宏之类的,不知道IML里能不能直接调用……
作者: shiyiming    时间: 2012-7-17 21:33
标题: Re: 紧急求助,编译器不一致引起的问题!
谢谢zhangzachary,这个问题我变通一下解决了。但是对您提出的call execute很感兴趣。能给出一个例子吗?非常感谢您。
作者: shiyiming    时间: 2012-7-18 10:22
标题: Re: 紧急求助,编译器不一致引起的问题!
其实我也不熟啦,举个help里面的例子:
[code:1i165iva]%macro overdue;
   proc print data=late;
      title "Overdue Accounts As of &sysdate";
   run;
%mend overdue;

data late;
   set sasuser.billed end=final;
   if datedue<=today()-30 then
      do;
         n+1;
         output;
      end;
   if final and n then call execute('%overdue');
run;[/code:1i165iva]



[code:1i165iva]%macro overdue;
   proc print data=late;
      title "Overdue Accounts As of &sysdate";
   run;
%mend overdue;

data late;
   set sasuser.billed end=final;
   if datedue<=today()-30 then
      do;
         n+1;
         output;
      end;
   if final and n then %overdue;  /* or use "do.. end" */
run;[/code:1i165iva]

前者只有当符合条件的时候才会调用宏,而后者直接把宏编译好放入data step里了,就会出现语法错误。
作者: shiyiming    时间: 2012-7-18 11:39
标题: Re: 紧急求助,编译器不一致引起的问题!
[code:2o205pv8]%let lagDate= %sysfunc(intnx('day',curDate,-&width));[/code:2o205pv8]修改为
[code:2o205pv8]lagDate=intnx('day',curDate,-&width);[/code:2o205pv8]即可用




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