SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1173|回复: 4
打印 上一主题 下一主题

紧急求助,编译器不一致引起的问题!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-7-16 22:48:32 | 只看该作者

紧急求助,编译器不一致引起的问题!

在数据集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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-7-17 13:57:05 | 只看该作者

Re: 紧急求助,编译器不一致引起的问题!

IML不熟悉……一般可以用call execute来使运行到当前步再编译宏之类的,不知道IML里能不能直接调用……
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-7-17 21:33:47 | 只看该作者

Re: 紧急求助,编译器不一致引起的问题!

谢谢zhangzachary,这个问题我变通一下解决了。但是对您提出的call execute很感兴趣。能给出一个例子吗?非常感谢您。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2012-7-18 10:22:18 | 只看该作者

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里了,就会出现语法错误。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2012-7-18 11:39:06 | 只看该作者

Re: 紧急求助,编译器不一致引起的问题!

[code:2o205pv8]%let lagDate= %sysfunc(intnx('day',curDate,-&width));[/code:2o205pv8]修改为
[code:2o205pv8]lagDate=intnx('day',curDate,-&width);[/code:2o205pv8]即可用
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 00:56 , Processed in 0.069551 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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