首页 > 解决方案 > 通过在 do loop SAS 中附加来创建列表

问题描述

我有一个宏变量


    %let dates = (200101, 200102, 200103);

如何创建此列表?


    var_out = pop_200101 pop_200102 pop_200103

我可以循环并选择日期:


    %do i=1 %to %sysfunc(countw(%superq(dates),%str(,)));
        %let this_date = %scan(&dates., &i.);

我可以连接:


    catt(pop,_&this_date.);

但我不知道如何将其实际放入列表中。

编辑:附加信息

我有一些数据


    data example;
     input Q40_ret_200101 Q40_ret_200102 Q40_ret_200103;
     datalines;
     4 6 .
     . 8 9
     3 7 4
     2 3 . 
     ;
     run;

我正在尝试做


    proc summary
     data = example nway;
     var Q40_ret_200101 Q40_ret_200102 Q40_ret_200103;
     output out = count
     N = pop_200101 pop_200102 pop_200103;
    run;

然而实际上我的数据集要大得多,我无法写入所有变量。我设法获得了 var 语句的变量名列表。


    PROC CONTENTS 
     DATA = example
     OUT = VAR_NAMES (KEEP = NAME) NOPRINT;
    RUN;

    /*read in variable names and use substr to test if starts with q40_ret*/
    DATA PARSE;
     SET VAR_NAMES;
     WHERE (SUBSTR(NAME, 1,8) = 'Q40_ret_');
    RUN; 

    DATA _NULL_;
     FILE 'C:';
     SET PARSE END = FINIS;
     IF _N_ = 1 THEN PUT '%LET VAR_LIST = ';
     PUT NAME;
     IF FINIS THEN DO;
     CALL SYMPUT('NUM' , COMPRESS(_N_));
     PUT ';';
     PUT 'RUN;';
     END;
    RUN;

    /*Next, the file ‘BUILD‘ is read back into the SAS program using a %INCLUDE statement.*/
    %include 'C:\BUILD';

到目前为止,我的 proc 摘要语句如下所示:


    proc summary
     data = example nway;
     var &var_list;
     output out = pop (drop = _TYPE_ _FREQ_)
     N =;
    run;

但我仍然需要生成并声明输出变量名称

标签: stringlistloopssasconcatenation

解决方案


辅助会话程序doSubL可以计算和填充var_out宏符号的值。使用的好处%sysfunc(doSubL(是边程序不会在调用会话中创建步骤边界。

例子:

宏变量值的构造dates也可以用作doSubL代码中的数组初始化。

%let dates = (200101, 200102, 200103);

%let rc=%sysfunc(dosubl(
  data _null_;
    array dates (%sysfunc(countw(&dates))) &dates;
    do index = 1 to dim(dates);
      length list $200;
      list = catx(' ', list, cats('pop_',dates(index)));
    end;
    call symput('var_out',trim(list));
  run;
));

%put &=var_out;

---------- LOG ----------
VAR_OUT=pop_200101 pop_200102 pop_200103

推荐阅读