全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2175 9
2012-09-17
问题是:
有一个数据文件,里面含有名称为envi的变量,总共有很多值,如:NPH,AVR,SOM……;现在需要将这几组分别输出到不同的数组里面。
因为考虑到envi值可能有很多,想用循环来解决。程序如下(假定它有3个值):
/*定义几个宏变量*/
%let mmm=magic.Detailed_cards_table;
%let m1=NPH;
%let m2=AVR;
%let m3=SOM;

/*定义宏XHUan*/
%macro xhuan;
%do i=1 %to 3;
data b&i;
set &mmm;
%if envi=&&m&i.. %then output b&i;
run;
proc print ;
run;
%end;
%mend xhuan;

/*执行循环*/
%xhuan


但是b1 b2 b3中的观测值个数都等于&mmm的值个数,根本没达到分组的效果。
请问是哪出了问题了?
二维码

扫码加我 拉你入群

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

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

全部回复
2012-9-17 15:59:10
%macro xhuan;
data
  %do i=1 %to 3;
          b&i
   %end; ;
set &mmm;
   %do i=1 %to 3;
      %if &i ne 1 %then else;
     if envi=&&m&i.. then output b&i;
   %end;
run;
%mend xhuan;
二维码

扫码加我 拉你入群

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

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

2012-9-17 17:59:46
pobel 发表于 2012-9-17 15:59
%macro xhuan;
data
  %do i=1 %to 3;
谢啦,问题解决了。为什么要加上这样一句?
%if &i ne 1 %then else;

&&m&i..  加两个&和两个.. 的意义是什么?
二维码

扫码加我 拉你入群

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

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

2012-9-17 18:40:28
pobel 发表于 2012-9-17 15:59
%macro xhuan;
data
  %do i=1 %to 3;
1402  %let mmm=magic.Detailed_cards_table;
1403  %let m1=NPH;
1404  %let m2=AVR;
1405  %let m3=SOM;
1406  %macro xhuan;
1407  data
1408    %do i=1 %to 3;
1409            magic.b&&m&i..
1410     %end; ;
1411  set &mmm;
1412     %do i=1 %to 3;
1413        %if &i ne 1 %then else;
1414       if envi=&&m&i.. then output magic.b&&m&i..;
1415     %end;
1416  run;
1417  %mend xhuan;
1418  %xhuan;

NOTE: 变量 NPH 未初始化。
NOTE: 变量 AVR 未初始化。
NOTE: 变量 SOM 未初始化。
NOTE: 从数据集 MAGIC.DETAILED_CARDS_TABLE 读取了 89 个观测。
NOTE: 数据集 MAGIC.BNPH 有 0 个观测和 14 个变量。
NOTE: 数据集 MAGIC.BAVR 有 0 个观测和 14 个变量。
NOTE: 数据集 MAGIC.BSOM 有 0 个观测和 14 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         0.01 秒
      CPU 时间         0.01 秒

我将程序变换了一下,显示为没有初始化
这个产生永久性文件的宏引用,出了什么问题了吗?
二维码

扫码加我 拉你入群

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

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

2012-9-17 19:11:11
冰棱 发表于 2012-9-17 17:59
谢啦,问题解决了。为什么要加上这样一句?
%if &i ne 1 %then else;
%if &i ne 1 %then else; 这一句是为了形成 if... else if.... else if 语句

两个&&涉及到宏变量的解析。
&&m&i的解析过程:
第一遍扫描:&&解析为&; m不变,&i得到i的值(例如1);扫描结果:&m1
第二遍扫描:得到宏变量m1的值
二维码

扫码加我 拉你入群

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

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

2012-9-17 19:13:31
冰棱 发表于 2012-9-17 18:40
1402  %let mmm=magic.Detailed_cards_table;
1403  %let m1=NPH;
1404  %let m2=AVR;
如果NPH,AVR,SOM为变量的值的话,应该:
%let mmm=magic.Detailed_cards_table;
%let m1=NPH;
%let m2=AVR;
%let m3=SOM;
%macro xhuan;
data
   %do i=1 %to 3;
           magic.b&&m&i..
    %end; ;
set &mmm;
    %do i=1 %to 3;
       %if &i ne 1 %then else;
      if envi= "&&m&i.." then output magic.b&&m&i..;
    %end;
run;
%mend xhuan;
%xhuan;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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