全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
23862 5
2013-03-15
program 1.
%macro data(data=,var1=,var2=,i=,j=);
data &data.;
  do i=1 to &i.;
  do j=1 to &j.;
    &var1.="&var1.&i.";
    &var2.="&var2.&j.";
    output;
   end;
  end;
run;
%mend;
%data(data=a,var1=a,var2=b,i=3,j=3);

program 2.
%macro data(data=,var1=,var2=,i=,j=);
data &data.;
  %do i=1 %to &i.;
   %do j=1 %to &j.;
    &var1.="&var1.&i.";
    &var2.="&var2.&j.";
    output;
   %end;
  %end;
run;
%mend;
%data(data=a,var1=a,var2=b,i=3,j=3);

why get two different results.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-3-15 15:40:49
运行程序时候加上options symbolgen就明白了。第一个程序do语句编译为普通文本,所以最后运行的code是
复制代码

第二个程序do循环是在编译的过程中使用的,多次引用了宏变量,所以在生成的code中是没有do循环的。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-15 17:01:07
在第一段code中,
do i=1 to &i.;
  do j=1 to &j.;
紧跟do后面的i,j是新定义的普通变量,所以会出现在data 这个dataset里。
   &var1.="&var1.&i.";
    &var2.="&var2.&j.";
这里&i和&j值一直没有发生变化,分别为3,3。所以最终data里面有四个变量,9组观测值。且后面两个变量a b的值始终是a3,b3.

在第二段code中,
%do i=1 %to &i.;
   %do j=1 %to &j.;
    &var1.="&var1.&i.";
    &var2.="&var2.&j.";
%do后面的i,j被定义为宏变量,那么括号里面的&i,&j值就随着循环发生变化,不再是最初定义的3和3.而是1和1,1和2,1和3循环下去,结果data中就只有两个变量a b,且值为a1,b1   a1,b2   a1,b3。。。。。。共9组观测值。
但是lz这里要注意一点,程序中是%do j=1 %to &j.;  %do后面定义的宏的名字j和最初的宏的名字j相同,这里就有点问题了。当&i=1时,sas在循环语句%do j=1 %to &j.之前,会先给定%do循环的值是从1到3,然后do%后面的第一个j就会分别从1开始给值,当给到4时,范围超出sas给定的最初范围,%do循环终止。但是第一个j已经给定4了。所以当&i=2时,后面的循环语句就变成 %do j=1 to 4 ,&i=3时,%do j=1 to 5。所以最终的结果不是9组观测值,而是12组观测值。为了防止出现这种不必要的麻烦,将%do j=1 %to &j.,改成 %do jj=1 %to &j.,最终就是我们预想的9组观测值了。   

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-25 10:53:24
恩,明白了,谢谢两位的解答
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-3-5 09:45:50
学习了,一般还真不会注意到!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-6-10 11:01:33
heperwong 发表于 2013-3-15 17:01
在第一段code中,
do i=1 to &i.;
  do j=1 to &j.;
不太明白j是怎么变化的
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群