楼主: 冰棱
1843 9

[原创博文] 如何自动分组? [推广有奖]

  • 0关注
  • 1粉丝

硕士生

21%

还不是VIP/贵宾

-

威望
0
论坛币
344 个
通用积分
0
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
1995 点
帖子
107
精华
0
在线时间
118 小时
注册时间
2006-2-27
最后登录
2018-6-15

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
问题是:
有一个数据文件,里面含有名称为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的值个数,根本没达到分组的效果。
请问是哪出了问题了?
二维码

扫码加我 拉你入群

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

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

关键词:detailed TAILED output detail outpu 如何 程序

沙发
pobel 在职认证  发表于 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;
已有 1 人评分学术水平 热心指数 收起 理由
冰棱 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

和谐拯救危机

使用道具

藤椅
冰棱 发表于 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 秒

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

使用道具

报纸
pobel 在职认证  发表于 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的值
和谐拯救危机

使用道具

地板
pobel 在职认证  发表于 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;
和谐拯救危机

使用道具

7
冰棱 发表于 2012-9-17 20:43:14 |只看作者 |坛友微信交流群
pobel 发表于 2012-9-17 19:11
%if &i ne 1 %then else; 这一句是为了形成 if... else if.... else if 语句

两个&&涉及到宏变量的解 ...
OK,两个点呢?

使用道具

8
pobel 在职认证  发表于 2012-9-17 21:06:13 |只看作者 |坛友微信交流群
冰棱 发表于 2012-9-17 20:43
OK,两个点呢?
点"."是显示地表示宏变量引用的结束。例如:
44   %let m1=hahaha;
45   %let m=m;
46
47   %put &m1;
hahaha
48   %put &m.1;
m1
已有 1 人评分学术水平 热心指数 收起 理由
冰棱 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

和谐拯救危机

使用道具

9
冰棱 发表于 2012-9-18 09:45:59 |只看作者 |坛友微信交流群
冰棱 发表于 2012-9-17 18:40
1402  %let mmm=magic.Detailed_cards_table;
1403  %let m1=NPH;
1404  %let m2=AVR;
then else 这句,then分句是空的,这句的意思也就是说,无论是否等于1,都执行else分句是吗?
那么形成if…… else if…… else有什么必要吗?
但不形成这样的句子,程序就出错

使用道具

10
pobel 在职认证  发表于 2012-9-18 10:02:19 |只看作者 |坛友微信交流群
冰棱 发表于 2012-9-18 09:45
then else 这句,then分句是空的,这句的意思也就是说,无论是否等于1,都执行else分句是吗?
那么形成i ...
%then 和 then是不一样的。%then是宏的语言,then是SAS语言。

%if &i ne 1 %then else; 如果宏变量i 的值是1,就不会有else这个词,如果不是1,宏就会写上这个词再执行下面的。
和谐拯救危机

使用道具

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

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

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

GMT+8, 2024-5-6 02:49