512 3

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

  • 0关注
  • 0粉丝

本科生

20%

还不是VIP/贵宾

-

威望
0
论坛币
13 个
学术水平
0 点
热心指数
1 点
信用等级
1 点
经验
1252 点
帖子
30
精华
0
在线时间
61 小时
注册时间
2016-8-13
最后登录
2018-9-17

蹦跶的小石头 发表于 2018-3-13 16:08:01 |显示全部楼层
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]

stata SPSS
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的用法已经有很多讨论了http://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,会清爽很多……
回复

使用道具 举报

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

GMT+8, 2018-9-23 01:37