SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1312|回复: 8
打印 上一主题 下一主题

求助!在数据步中调用另外一个宏

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-9-30 13:03:00 | 只看该作者

求助!在数据步中调用另外一个宏

比如有两个数据集,t1,如下:
r1        r2        r3        r4        r5                                       
1.1        1.4        1.3        1.5        1.9                                       
t2,如下:
s1        s2        s3        s4        s5        s6        s7        s8        s9        s10
1.12        1.34        1.38        1.45        1.69        1.6        1.4        1.2        2.4        2.8


现在要从这两个数据集中计算出一个数,规则是这样的,i从1到11,若i=1,则y=r1对应的数1.1,若i=1.5,则取r1和r2的均值,若i=2.5,则取r2和r3的均值,若i>5,则要从t2中取,规则一样,若i=8.5,则取s8和s9的均值,若i>10,则取0.

我是通过在数据步中调用另一个宏,但总通过不了,请问各位高手,问题出在哪?

程序如下:

%macro aaa;
%do i=1 %to 11 %by 0.5;
data _null_;
set t1;
array r(*) _all_;
do j=1 to dim(r);
if &i.<=dim(r) and j<=&i. and j>(&i.-1) then y=(r(j)+r(j+1))/2;
if &i.>dim(r) then do;
%bbb;
y=&yy.;
end;
run;
call symput("y",y);
%put _user_;
%mend aaa;
%aaa;

%macro bbb;
data _null_;
set t1;
array s(*) _all_;
do j=1 to dim(s);
if &i.<=dim(s) and j<=&i. and j>(&i.-1) then yy=(s(j)+s(j+1))/2;
if &i.>dim(s) then yy=0;
call symput("yy",yy);
end;
run;
%mend bbb;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-9-30 13:32:47 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

貌似宏变量yy是局部的,是不是先定义%global yy;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-10-5 21:54:11 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

感谢楼上的回复,但是不是问题所在,请各位高手指点一下 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->  <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-10-6 10:05:35 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

你的错误:

1 宏循环%do 不匹配 少了个%end, 而且宏循环的步长不能为小数;

2 带有宏变量运算的取值应该用%eval(&amp;i.-1);

3 call symput(&quot;y&quot;,y); 不能在过程步外;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2007-10-7 13:29:08 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

感谢楼上的意见,我按照上述意见进行了修改,程序仍然通不过,显示如下:

NOTE: Line generated by the invoked macro &quot;BBB&quot;.
1     data _null_; set t1; array s(*) _all_; do j=1 to dim(s); if &amp;i.&lt;=dim(s) and j&lt;=&amp;i. and
     -
     117
1  ! j&gt;%eval(&amp;i.-1) then do; yy=(s(j)+s(j+1))/2;end; if &amp;i.&gt;dim(s) then do;yy=0;end; call
1  ! symput(&quot;yy&quot;,yy); end; run;

[color=#FF0000:38365]ERROR 117-185: There were 2 unclosed DO blocks.[/color:38365]


180: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL may allow recovery of the LINE and COLUMN where
      the error has occurred.
[color=#FF0000:38365]ERROR 180-322: Statement is not valid or it is used out of proper order.[/color:38365]


恳请高手指点,或有何其他办法实现!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2007-10-8 09:00:32 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

你应该改macro aaa  而不是bbb
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2007-10-8 16:43:24 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

还是找不到解决办法,继续请教高手! <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2007-10-8 16:53:55 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

[code:aa23e]proc delete data=_all_;run;
data a;
do i=1 to 11 by 0&#46;5;output;
end;
run;

data t1;
input r1 r2 r3 r4 r5 ;
cards;
1&#46;1 1&#46;4 1&#46;3 1&#46;5 1&#46;9
;
data t2;
input s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 ;
cards;
1&#46;12 1&#46;34 1&#46;38 1&#46;45 1&#46;69 1&#46;6 1&#46;4 1&#46;2 2&#46;4 2&#46;8
;
proc transpose data=t1 out=t11(drop=_name_) prefix=x;
run;
proc transpose data=t2 out=t22(drop=_name_) prefix=x;
run;
data part1;set t11 t22;
run;

%macro tt;
%do i=1 %to 2;
data tt&amp;i(keep=x1);
set t&amp;i;
array aa(*) _numeric_;
do j=2 to dim(aa);
x1=mean(aa(j),aa(j-1));
output;
end;
proc append base=part2 data=tt&amp;i force;
%end;
run;
%mend;
%tt

data tt1 tt2;
set a;
if scan(i,2)=5 then output tt1;
else output tt2;
run;

data part1_;
set tt2 ; set part1;
run;

data part2_;
set tt1;set part2;
run;

data result;
set part1_ part2_;
if i&gt;10 then x1=0;
proc sort;by i;
run;

[/code:aa23e]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2007-10-9 15:37:33 | 只看该作者

Re: 求助!在数据步中调用另外一个宏

谢谢高手指点!
偶也找到了较笨的解决办法, <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> ,学习楼上的算法 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

huadi谈到的几点,关于宏变量的计算要使用%eval,实际上并非如此,在宏的赋值语句中,的确是这样的,在%if语句中,可以直接写,但引用到的宏变量似乎只能是整数,四则运算的结果为小数则是被允许的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 12:10 , Processed in 0.359940 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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