请选择 进入手机版 | 继续访问电脑版
楼主: gaotao0727
934 3

[问答] 这个宏很奇怪,谢谢高手指点~~ [推广有奖]

  • 1关注
  • 10粉丝

副教授

79%

还不是VIP/贵宾

-

威望
0
论坛币
540 个
通用积分
11.2790
学术水平
18 点
热心指数
18 点
信用等级
12 点
经验
27715 点
帖子
873
精华
0
在线时间
855 小时
注册时间
2011-8-8
最后登录
2023-3-1

gaotao0727 发表于 2014-6-24 18:35:58 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
功能:对一个数据集中所有名义变量的属性值及频数频率进行统计,生成一个新的数据集;
变量包括:变量名,属性数目,属性集(用逗号分隔),该变量最大频数的属性及相应频率,次大频数的属性及相应频率;
代码如下:
  1. %macro NomFirst2Freq(Lib,DSin,DSout);
  2. proc sql noprint;
  3.   create table &Lib..&DSout (Variablename char, PropertyNum num,AttriDictionary char(100),
  4.                                            FirstPropertyValue char,FirstPropertyFreq num,
  5.                                            SecondPropertyValue char,SecondPropertyFreq num);
  6. quit;

  7. proc contents data=&Lib..&DSin out=temp_content noprint;
  8. run;

  9. proc sql noprint;
  10.   select name into :VarList separated by " " from temp_content where type = 2;
  11. quit;
  12. %put &VarList;

  13. %let i=1;
  14. %let condition = 0;
  15.     %do %until (&condition =1);
  16.     %let Var&i=%scan(&VarList,&i);
  17.       %if "&&Var&i" ="" %then %let condition =1;
  18.       %else %let i = %Eval(&i+1);
  19.     %end;
  20. %let Nvars=%eval(&i-1);   

  21. %do i=1 %to &Nvars;
  22. proc freq data=&Lib..&DSin noprint;
  23.   tables &&Var&i /missing out=Freq_Var;
  24. run;
  25. proc sort data=Freq_Var;
  26.   by decending percent;
  27. run;

  28. proc sql noprint;
  29.   select count(*) into :PropertyNum from Freq_Var;
  30.   select &&Var&i into :AttriDictionary separated by "," from Freq_Var;
  31. quit;
  32. %put &AttriDictionary;

  33. data temp_value;
  34.   set Freq_Var;
  35.   retain N 1;
  36.   %if N le 3 %then %do;call symput("percent"||left(N),percent);call symput("X"||left(N),&&Var&i);N+1;%end;
  37. run;

  38. proc sql noprint;
  39.   insert into &Lib..&DSout  values("&&Var&i",&PropertyNum,"&AttriDictionary",
  40.                                                     "&X1",&percent1,
  41.                                            "&X2",&percent2);
  42. quit;

  43. %end;
  44. %mend;
  45. %NomFirst2Freq(work,Creditcard,a);
复制代码
问题出现在红色字体的代码部分,不知道为什么N le 3一直就没有成立过,所以就不会执行后面的语句,达不到预期的效果。而将这部分代码单独拿出来运行是没有问题的,不知道为什么在宏里面就会出现这种问题,还望高手指点,感激不尽`~~


二维码

扫码加我 拉你入群

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

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

关键词:高手指点 Dictionary condition property proc sql

衣带渐宽终不悔,为伊消得人憔悴~~
gaotao0727 发表于 2014-6-24 18:37:56 |显示全部楼层 |坛友微信交流群
data temp_value;
  set Freq_Var;
  retain N 1;
  %if N le 3 %then %do;call symput("percent"||left(N),percent);call symput("X"||left(N),&&Var&i);N+1;%end;
run;
宏中红色字体的代码就是上段代码,一发表颜色就没有了,不好意思~~

使用道具

yongyitian 发表于 2014-6-24 20:56:01 |显示全部楼层 |坛友微信交流群
/* try to remove % before if, then, do, end */

data temp_value;
  set Freq_Var;
  retain N 1;
   if N le 3 then do;
     call symput("percent"||left(N),percent);call symput("X"||left(N),&&Var&i);
   N+1;
   end;
run;

使用道具

gaotao0727 发表于 2014-6-25 10:32:05 |显示全部楼层 |坛友微信交流群
yongyitian 发表于 2014-6-24 20:56
/* try to remove % before if, then, do, end */

data temp_value;
恩,没有问题了,非常感谢,哈哈~~~

使用道具

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

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

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

GMT+8, 2024-3-29 02:18