楼主: hkhl237
22797 5

do循环和%do循环问题 [推广有奖]

  • 0关注
  • 0粉丝

博士生

68%

还不是VIP/贵宾

-

威望
0
论坛币
2234 个
通用积分
1.1292
学术水平
5 点
热心指数
6 点
信用等级
4 点
经验
31779 点
帖子
141
精华
0
在线时间
519 小时
注册时间
2008-12-8
最后登录
2024-4-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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.
二维码

扫码加我 拉你入群

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

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

关键词:do循环 Different Program results output different

沙发
stormhoof 发表于 2013-3-15 15:40:49 |只看作者 |坛友微信交流群
运行程序时候加上options symbolgen就明白了。第一个程序do语句编译为普通文本,所以最后运行的code是
  1. data a1;
  2. do i=1 to 3;
  3. do j=1 to 3;
  4. a="a3";
  5. b="b3";
  6. output;
  7. end;
  8. end;
  9. run;
复制代码

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

已有 1 人评分论坛币 学术水平 收起 理由
Imasasor + 60 + 3 热心帮助其他会员

总评分: 论坛币 + 60  学术水平 + 3   查看全部评分

使用道具

藤椅
heperwong 发表于 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组观测值了。   

已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
Imasasor + 60 + 80 + 3 + 2 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 80  学术水平 + 3  热心指数 + 2   查看全部评分

使用道具

板凳
hkhl237 发表于 2013-3-25 10:53:24 |只看作者 |坛友微信交流群
恩,明白了,谢谢两位的解答

使用道具

报纸
gafciausa 发表于 2015-3-5 09:45:50 |只看作者 |坛友微信交流群
学习了,一般还真不会注意到!

使用道具

地板
944536616@qq.co 发表于 2016-6-10 11:01:33 |只看作者 |坛友微信交流群
heperwong 发表于 2013-3-15 17:01
在第一段code中,
do i=1 to &i.;
  do j=1 to &j.;
不太明白j是怎么变化的

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-4 14:42