[英]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.