0

是否可以将%let语句分配为等于表中调用的值?我知道我可以使用以下代码循环执行此操作。

proc sql noprint;
    select NameID into :Name separated by " "
    from Registration;
quit;

proc sql noprint;
    select count (*) into :NumNAME
    from Registration;
quit;

有没有一种方法可以在循环之外完成,或者只需一步,通过创建一些%let Name =东西来直接调用表格?我意识到这类似于以前的问题,我只是更挑剔。

4

1 回答 1

2

%Let 语句对于这类事情不是很灵活。

但是, CALL SYMPUT可以在数据步骤的中间使用来设置宏变量,并且可能会有所帮助。

怎么样:

data myReg;
INPUT Name $;
DATALINES;
Alex
Alex
Ben
Ben
Ben
Calvin
Calvin
Calvin
Calvin
;
run;

proc sort data=myReg; by name;run;
data MakeSomeMacroVars;
        set myReg end=LastRow;
        by name;

        length Allnames $30000;*Variable for space separated list of names;
        retain AllNames ' ';

        cnt+1;
        if last.name THEN DO;
                *Create a macro variable NUM_Alex or similar, with value equal to cnt;
                CALL SYMPUT (cats('NUM_',name),cats((put(cnt,12.))));
                cnt=0;
                *Add name to space separated list;
                Allnames = catx(" ",AllNames, name);
        END;

        if LastRow THen do;
                Call Symput ('AllNames',cats(compbl(AllNames)));
        END;
RUN;
%Put Alex has --&NUM_Alex--; * --> 2;
%Put Ben has --&NUM_Ben--; * --> 3;
%Put List of names is: --&AllNames--; * --> Alex Ben Calvin;
于 2013-06-28T22:00:47.163 回答