簡體   English   中英

通過在執行循環 SAS 中附加來創建列表

[英]Create list by appending in do loop SAS

我有一個宏變量


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

如何創建此列表?


    var_out = pop_200101 pop_200102 pop_200103

我可以循環通過 select 日期:


    %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;

但是我仍然需要生成 state 和 output 變量名

doSubL端 session 程序可以計算和填充var_out宏符號的值。 使用%sysfunc(doSubL(的好處是邊程序在調用 session.

例子:

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

如果您可以通過刪除括號和逗號來稍微更改您的列表,這很容易。 或者,您可以使用 COMPRESS() 刪除括號和逗號,然后使用此解決方案。

%macro prefix(prefix,list);
  %local i bit;
  %let i=1;
  %let bit=%sysfunc(scanq(&list,&i,%str( )));
  %do %while(%length(&bit));
&prefix.&bit
    %let i=%eval(&i+1);
    %let bit=%sysfunc(scanq(&list,&i,%str( )));
  %end;
%mend prefix;

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

%let want = %prefix(pop_, 200101 200102 200103);

%put &want;

通過: http://www.datasavantconsulting.com/roland/Spectre/utilmacros/prefix.sas

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM