全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1713 3
2018-03-13
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]
二维码

扫码加我 拉你入群

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

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

全部回复
2018-3-14 01:04:57
牛逼。其实就是排列组合
二维码

扫码加我 拉你入群

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

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

2018-4-2 23:48:00
运行了你的code,没有问题啊,是不是Test2数据集出问题了,检查一下
二维码

扫码加我 拉你入群

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

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

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。所以,我觉得可以编写宏来实现你的需求。
复制代码
不过,你通过%put来看这些宏变量,log中会很乱,效果不好,你可以把这些宏变量存储在一个数据集里,再统一print,会清爽很多……
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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