我正在撰寫修改前一個資料步驟中宣告的陣列的代碼。由于它是一個新的資料步驟,因此舊索引將不起作用。我想我可以在呼叫符號函式的幫助下使用迭代器。我試圖為每個 MID_(i) 陣列元素分配 0 值,其中月份 < "i" 所以我想出了代碼:
data want;
set summary;
do i=1 to &MAX_MONTH.;
call symputx('iterator',i);
if MONTH < &iterator. then MID_&iterator. = 0;
end;run;
它不起作用。我正在試驗代碼來除錯它并插入一個常量值而不是“i”:
data want;
set summary;
do i=1 to &MAX_MONTH.;
call symputx('iterator',7);
if MONTH < &iterator. then MID_&iterator. = 0;
end;run;
更讓我困惑的是,這段代碼只能運行一次。當我將 '7' 更改為其他數字時,結果保持不變,直到我重置 SAS,之后它將使用更改后的值,但仍然 - 只有一次。
這里會發生什么?我不明白什么?如何創建一個作業迭代器?
uj5u.com熱心網友回復:
我建議完全堅持使用陣列,如果您的變數有命名約定,您就不需要其他任何東西。
我沒有你的資料,但我想知道這樣的簡化是否也能奏效。
data want;
set summary;
array mid_[*] mid_:;
do i=1 to month-1;
MID_[i] = 0;
end;
run;
uj5u.com熱心網友回復:
宏處理器首先將宏運算式轉換為文本。因此&MAX_MONTH,&iterator在 SAS 甚至開始編譯資料步驟之前,并且肯定在它有機會運行 CALL SYMPUTX() 或 IF 陳述句之前,已經被它們的值替換了。
因此,如果 MAX_MONTH 的值為 12,而 ITERATOR 的值為 7,則您運行此資料步驟:
data want;
set summary;
do i=1 to 12;
call symputx('iterator',i);
if MONTH < 7 then MID_7 = 0;
end;
run;
這與運行相同:
data want;
set summary;
if MONTH < 7 then MID_7 = 0;
i=13;
run;
%let iterator=12;
ARRAY 陳述句是用于通過變數在串列中的位置來參考變數的資料步驟方法。因此,如果您想參考名稱為 MID_1、MID_2 等的變數,請定義一個陣列并使用該陣列的索引。您仍然可以使用 MAX_MONTH 宏變數來定義要包含在陣列中的變數集。
所以也許你打算運行這樣的東西:
data want;
set summary;
array mid_ [&max_month] ;
do index=month 1 to dim(mid_);
MID_[index] = 0;
end;
drop index;
run;
uj5u.com熱心網友回復:
symput并symputx在資料步驟結束后創建宏變數。不能在同一資料步驟中訪問正在創建的宏變數。每次symput呼叫,都會更新最后輸出的宏變數。
根據call symput 檔案:
在 SYMPUT 創建宏變數并為其賦值的同一程式(或步驟)中,您不能使用宏變數參考來檢索宏變數的值。
在參考程式后面的全域陳述句(例如,TITLE 陳述句)中的值之前,必須指定步邊界陳述句以強制執行 DATA 步。邊界可以是 RUN 陳述句或另一個 DATA 或 PROC 陳述句。
你不需要使用symput來實作你的目標。i已經在迭代,如果你創建一個新的mid_變數陣列,你可以使用它。
data want;
set summary;
array mid_[&MAX_MONTH.];
do i=1 to dim(mid_);
if MONTH < i then MID_[i] = 0;
end;
run;
uj5u.com熱心網友回復:
Stu、Tom 和 Reeza 都以您應該這樣做的方式回答了這個問題。
但是,為了完整起見,您可以通過以下方式使用宏變數執行此操作:也可以使用宏%do。這不是解決您的確切問題的正確方法,但有些問題可能需要這種方法。
%let max_month=12;
data summary;
do month = 1 to 12;
output;
end;
run;
%macro do_months(max_month);
data want;
set summary;
%do i=1 %to &MAX_MONTH.;
if MONTH < &i. then MID_&i. = 0;
%end;
run;
%mend do_months;
%do_months(max_month=12);
在這里,如果您打開,options mprint;您可以看到 SAS 正在做什么:它if為您生成12 條陳述句,每個陳述句的迭代器和 mid_ 變數都有不同的值。每次通過資料步驟都會執行所有 12 個。它的效率遠不及陣列解決方案,而且除錯起來要困難得多,因此除非需要,否則不要這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347356.html
