1475 3

[程序分享] 有一段代码百思不得其解,求各位大神告知错在哪! [推广有奖]

  • 0关注
  • 1粉丝

本科生

54%

还不是VIP/贵宾

-

威望
0
论坛币
3 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
1 点
经验
1472 点
帖子
32
精华
0
在线时间
92 小时
注册时间
2016-8-13
最后登录
2020-6-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
DATA TEST2;
ARRAY X[10] (1:10);
N=DIM(X);
K=6;
NCOMB=COMB(N,K);
    DO CHOICE=1 TO NCOMB;
        CALL ALLCOMB(CHOICE,K, OF X[*]);
        OUTPUT;
    END;
    KEEP CHOICE X1-X6;
RUN;

OPTION SYMBOLGEN MLOGIC;
%MACRO COMBINATION(NUM=);
DATA PROD1_#
SET TEST2(WHERE=(CHOICE=&NUM.));
RUN;

PROC TRANSPOSE DATA=PROD1_&NUM. OUT=PROD2_&NUM.(RENAME=(COL1=COL_&NUM.));
VAR X1-X6;
BY CHOICE;
RUN;

PROC SORT DATA=PROD2_&NUM.;
BY COL_&NUM.;
RUN;

PROC SQL;
SELECT COL_&NUM.
INTO :VAR1-:VAR6
FROM PROD2_&NUM.;
QUIT;

%PUT &VAR1 &VAR2 &VAR3 &VAR4 &VAR5 &VAR6;
%MEND;

DATA _NULL_;
    SET TEST2;
    CALL EXECUTE('%COMBINATION(NUM='||CHOICE||')');
RUN;

以上就是我的代码,但是出来的结果VAR1-VAR6 永远都是一样的3,4,5,6,9,10,而我预想的是CHOICE取值不一样,对应的VAR1-VAR6 是210组不一样的取值; 然而,如果给这段代码定某一个值,比如,num=100,运行下来就完全没问题,真是不知道错在哪里了,求各位大神帮忙看看!拜托了~~拜托了~~[cry]
二维码

扫码加我 拉你入群

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

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

关键词:百思不得其解 combination Transpose proc sql EXECUTE

沙发
sas9.4 发表于 2018-3-14 01:04:57 来自手机 |只看作者 |坛友微信交流群
牛逼。其实就是排列组合

使用道具

藤椅
abc630110845 发表于 2018-4-2 23:48:00 |只看作者 |坛友微信交流群
运行了你的code,没有问题啊,是不是Test2数据集出问题了,检查一下

使用道具

板凳
lava_mb 发表于 2018-4-4 15:45:25 |只看作者 |坛友微信交流群
楼主,你的代码逻辑都ok,只是使用call execute有点问题。你在跑代码后的log中也能看到,会先执行多个%put,而那些宏变量会是同一个值,还未被sql中into语句赋值。至于原理,是因为call execute会首先执行所有的宏程序,然后才会执行data步和proc步。论坛中对call execute的用法已经有很多讨论了https://bbs.pinggu.org/thread-3240581-1-1.html。所以,我觉得可以编写宏来实现你的需求。
  1. DATA TEST2;
  2.     ARRAY X[10] (1:10);
  3.     N=DIM(X);
  4.     K=6;
  5.     NCOMB=COMB(N,K);
  6.     Call Symputx('comb_num',NCOMB);
  7.     DO CHOICE=1 TO NCOMB;
  8.         CALL ALLCOMB(CHOICE,K, OF X[*]);
  9.         OUTPUT;
  10.     END;
  11.     KEEP CHOICE X1-X6;
  12. RUN;

  13. %MACRO list_comb;
  14. %do i=1 %to &comb_num.;
  15.       %combination(num=&i)
  16. %end;
  17. %MEND;
  18. %list_comb
复制代码
不过,你通过%put来看这些宏变量,log中会很乱,效果不好,你可以把这些宏变量存储在一个数据集里,再统一print,会清爽很多……

使用道具

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

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

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

GMT+8, 2024-4-19 22:45