我有一個宏變數 &var_list,它存盤來自資料集的整數變數名稱串列。
%put &var_list.;
id trt grade
現在我想創建一個新的資料集,其中每個上述變數名本身都成為一個陣列——我需要使用宏變數來完成,因為最終我的&varlist將有大約 1000 個變數。我想要創建一個新資料集的宏代碼,其中所有現有變數都變成長度為 4 的陣列。像這樣:
data want;
array id_var{4};
array trt_var{4};
array grade_var{4};
set have;
run;
我已經嘗試了以下宏代碼,但它運行不正確。我正在嘗試遍歷&var_list,將字串“var”連接到變數名,并在末尾添加一個 {4} 以將每個變數宣告為一個陣列。但 SAS 抱怨關鍵字“array”是一個未宣告的陣列變數。它沒有意識到我正在嘗試在 %do 宏中使用關鍵字陣列。另外,宣告陳述句中的{4}怎么辦?
%put &var_list.;
id trt等級
%macro getArrayData(dat);
data &dat;
%do i=1 %to 3;
array %scan(&var_list,&i.)_var {4};
%end;
set have;
run;
%mend getArrayData;
%getArrayData(want);
uj5u.com熱心網友回復:
旁白:考慮到最終擁有 1,000 個{4}專案陣列,您可能需要考慮使用一個二維陣列{1000,4}
打開時日志顯示什么OPTIONS MPRINT;
您顯示的代碼確實可以正常作業。我建議將編碼var_list作為宏引數而不是依賴于全域宏變數。
data have;
run;
%macro getArrayData(dat, var_list);
data &dat;
%do i=1 %to 3;
array %scan(&var_list,&i.)_var {4};
%end;
set have;
run;
%mend getArrayData;
options mprint;
%getArrayData(want, a b c);
日志
56 %getArrayData(want, a b c);
MPRINT(GETARRAYDATA): data want;
MPRINT(GETARRAYDATA): array a_var {4};
MPRINT(GETARRAYDATA): array b_var {4};
MPRINT(GETARRAYDATA): array c_var {4};
MPRINT(GETARRAYDATA): set have;
MPRINT(GETARRAYDATA): run;
根據have上面的列將創建變數
a_var1-a_var4 , b_var1-bvar4 , cvar1-cvar4
通常,宏中的空格分隔串列迭代為
%do index = 1 %to %sysfunc(countw(&list,%str( )));
%let item = %sysfunc(scan(countw(&list,%str( )));
/* do things with &item */
%end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514925.html
標籤:数组sassas-宏
上一篇:2D陣列中的記憶體分配與Java中的2DArraylist
下一篇:在C函式中回傳字符陣列
