楼主: tangb
4623 16

[原创博文] 怎样正常退出SAS和安排带大循环的主程序? [推广有奖]

11
tangb 发表于 2009-8-28 11:42:23
你的意思是我需要宏,对吗?

以我的粗浅的对宏的认识,我一直认为宏要加在处理日交易的那一堆子 data 步上的。

我现在这个程序是主程序。


另外, 我的内循环是为了从一个30万条的365天的数据集里挑出一天的数据而循环的。这样也可以取消吗?
是因为用了宏要取消?


多谢回复

12
tangb 发表于 2009-8-28 11:43:35
if num ^= k then output;

因该是: if date = k then output;

13
horace_chen 发表于 2009-8-28 12:35:57
11# tangb

Data sample.F(drop=k);
           set sample.E;
           where date=k;
run;

这样就可以把第K天的数据读取出来了。

14
tangb 发表于 2009-8-28 12:45:18
对就是这个思路:把年数据先拆成日的,然后把日的数据处理完。在处理下一天的,一直把一年的数据处理完毕。我当时写程序,还没精炼。应该用where的,if 实在太浪费了。

如果写成宏加到主程序。sample.f使我处理日数据的起点数据集。

因为初学,写的程序非常罗索,含有无数个中间的数据集,都是假设一天的情况下做的。

当我写完那一大堆的日处理的子程序后,想当然的以为做个双循环就可以把这个程序写完了。根本没读宏那部分。现在看来差点要酿成大错。

15
tangb 发表于 2009-8-29 11:33:31
horace_chen

所给的 建议是有效的:
%macro sample;
  %do k=1 %to 365;
  Data sample.F(drop=k);
       do i=1 to totobs; /*这个嵌套似乎可以去掉,set默认循环*/
           set sample.E point=i nobs= totobs;
           if num ^=   k   then output;
       end;
   run;  
   处理日交易的许多个data 步;
   %end;
%mend;

%sample;



就是K (标红)忘了提醒改成 &k, 总之,表示感谢!并更正一下,瑕不掩瑜

16
fxf258 发表于 2009-8-29 13:40:26
您处理的具体目的我不是很明白,但建议您可以把每日需要处理的项目编写一个宏,这个红的一个宏参数设置为日期,直接调用宏参数为您要处理的哪日,这样可能运行起来比较省时间。不知有帮助否?

17
fxf258 发表于 2009-8-29 13:44:14
思路如下,仅供参考:
%macro sample(date1,data2);
  %do k=&date1%to &date2;
     处理日交易的许多个data 步;
   %end;
%mend;

%sample(date1,date2);
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
tangb + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 04:41