楼主: harlon1976
11951 14

如何退出SAS宏循环 [推广有奖]

  • 2关注
  • 27粉丝

版主

院士

54%

还不是VIP/贵宾

-

威望
1
论坛币
33781 个
通用积分
135.1232
学术水平
25 点
热心指数
39 点
信用等级
17 点
经验
59249 点
帖子
1928
精华
0
在线时间
4352 小时
注册时间
2005-8-27
最后登录
2025-12-9

楼主
harlon1976 发表于 2010-2-15 19:39:16 |AI写论文
50论坛币
现在经行宏循环,如果具备某个条件就退出这个宏循环,应该使用什么样的语句经行控制实现这个功能。请高手给予解决。不胜感激。

关键词:SAS宏 宏循环 不胜感激 SAS

回帖推荐

soporaeternus 发表于8楼  查看完整内容

我理解1维聚类的终止条件为所有CLUSTER的极差的最大值小于给定值,如果真是需要最小值的话,修改那个宏赋值语句max为min就可以了,不是统计出生,聚类也是半路出家,呵呵 三个参数依次为起始CLUSTER数,实验最大CLUSTER数,那个给定值。宏很粗糙,没做太多判别,稍微测试了下,可以用,希望对你有帮助。 祝新年快乐

本帖被以下文库推荐

沙发
醉_清风 发表于 2010-2-15 19:48:24
有没有尝试写个IF条件语句?
从来不需要想起 永远也不会忘记

藤椅
lbcen86 发表于 2010-2-15 19:48:28
好多的钱哦

板凳
醉_清风 发表于 2010-2-15 19:49:16
楼主确实很富有啊
从来不需要想起 永远也不会忘记

报纸
harlon1976 发表于 2010-2-15 19:55:05
写过好像不行,这个不是普通的而是在宏循环中,请不要随意灌水发帖。

地板
ademons 发表于 2010-2-15 21:35:00
%goto语句直接跳出。

不过我没用过它。
教科书都说goto不好嘛。
需要中途退出循环的情况,我一般用%do %while或%do %until,而不用%do... %to...。

7
soporaeternus 发表于 2010-2-15 22:14:29
能看看循环体或者是楼主的大致想法吗
Let them be hard, but never unjust

8
soporaeternus 发表于 2010-2-16 10:48:24
  1. data a;
  2. do i=0 to 9 by 1;
  3. do x=i+0.995 to i+1.005 by 0.001;
  4. output;
  5. end;
  6. end;
  7. drop i;
  8. run;

  9. %MACRO TST(min_n,max_n,max_range);
  10. %let cls=&min_n;
  11. %let rc=1;
  12. %do %while (%eval(&rc));
  13. proc fastclus data=a MAXCLUSTERS=&cls out=b_&cls;run;quit;
  14. proc sql;
  15. create table c_&cls as
  16. select
  17. cluster
  18. ,max(x)-min(x) as range
  19. from b_&cls
  20. group by cluster
  21. ;
  22. quit;
  23. proc sql;
  24. select max(range) into:max_range_now from c_&cls;
  25. quit;
  26. %put NOW MAX_RANGE IS &max_range_now N_CLS IS &cls;
  27. %if &max_range_now<=&max_range %then %do;
  28. %let rc=0;
  29. %end;
  30. %else %do;
  31. %let cls=%eval(&cls+1);
  32. %if &cls>&max_n %then %let rc=0;
  33. %end;
  34. %end;
  35. %MEND TST;
  36. %TST(1,150,0.01);
复制代码

我理解1维聚类的终止条件为所有CLUSTER的极差的最大值小于给定值,如果真是需要最小值的话,修改那个宏赋值语句max为min就可以了,不是统计出生,聚类也是半路出家,呵呵
三个参数依次为起始CLUSTER数,实验最大CLUSTER数,那个给定值。宏很粗糙,没做太多判别,稍微测试了下,可以用,希望对你有帮助。

祝新年快乐
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

Let them be hard, but never unjust

9
bobguy 发表于 2010-2-16 12:11:27
Use %return; statement.

Here is the definition for %return

The %RETURN macro causes normal termination of the currently executing macro.



%macro test(dummy,test=out);
   %do i = 1 %to 5;
       %put >>>&i<<<;
       %if %upcase(&test)=OUT %then %return;
    %end;

%mend test;

%test(dummy,test=stay)
%test(dummy,test=out)

10
harlon1976 发表于 2010-2-16 20:15:51
9楼的同志的程序是不是应该可以理解为退出%do,等价地退出宏。我仿照这个理解,编写如下程序:
%macro ml(n,m,zb);
data a;
do i=1 to &n;
x=uniform(0);
fi=arcos(-1);
y=sin(2*fi*x);
output;
keep y x fi i;
end;
%do j=2 %to &m;
proc fastclus data=a out=Clust&j maxclusters=&j noprint;
var x;
proc sort out=flei&j;by cluster;
proc means noprint data=flei&j;
var x; by cluster;
output out=menx&j(keep=rx) range=rx;
proc means data=menx&j noprint;
var rx;
output out=big&j max=zuizhi;
data pb&j;
set  big&j ;
%if zuizhi le &zb %then %return;
%end;
%%mend ml(n,m,zb);
%ml(200,15,0.4);run;
但提交出现问题,问题就在%if 这里,不知高手是否给予修正呢?
谢谢。
上面程序是确定一个最好的分类数,使得各个类内的变量的极差最大值小于事先给定的值,此时退出循环,得到最终的分类结果。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 13:47