[英]Macro loop in SAS - passing value to condition
我是SAS的初學者,並且在SAS中的宏循環方面有些掙扎。 下面的代碼說明了該問題。 此處的任務是創建單獨的子集,並將它們另存為庫,以供以后進行后期處理。 另外,我添加了可視化圖表。 我在一個巨大的數據庫上進行操作,但是對於本帖子,我在代碼的開頭創建了一個示例以簡化操作。
但是,似乎內部條件(IF ID = i)並未過濾掉數據。 相反,內部循環會創建一個空表(但具有正確的名稱:“ SUB1”,“ SUB2”,“ SUB3”),並帶有一個名為“ i”的列(變量)。
DATA EXAMPLE;
INPUT ID DATE DDMMYY8. VALUE;
FORMAT DATE DDMMYY8.;
DATALINES;
1 01012011 100
1 01022011 400
1 01032011 678
2 01012011 678
2 01022011 333
2 01032011 333
3 01012011 733
3 01022011 899
3 01032011 999
;
%MACRO filter(number);
%DO i=1 %TO &number;
DATA SUB&i;
SET WORK.EXAMPLE;
IF ID = i;
PROC SGPLOT DATA=SUB&i;
reg x=DATE y=VALUE;
RUN;
%END;
%mend filter;
%filter(3);
如果手動復制零件並將其粘貼到宏中,然后手動將i更改為數字1到3,則會創建正確的圖形。 該代碼有什么問題? 如何在代碼內傳遞DO語句中的值?
我正在使用SAS Studio。
宏正在創建空數據集,因為宏最終寫入的代碼包含if
語句的子集
if ID = i;
由於數據集不包含可變i
一個新的變量命名為i
被添加到PDV和輸出數據集SUB1
, SUB2
, SUB3
。 i
的默認值丟失,並且沒有ID值丟失,因此沒有行通過測試,並且您獲得了空數據集。 該日志還將提供有關情況的線索:
NOTE: Variable i is uninitialized.
為“宏化”抽象代碼段時,請確保在宏變量前面使用&
。 因此,當宏包含
if ID = &i;
宏系統編寫的最終代碼將具有3個相似的代碼操作,並且具有不同的宏變量值。
...
if ID = 1;
...
...
if ID = 2;
...
...
if ID = 3;
...
現在,由於三個數據集SUB1,SUB2,SUB3都使用相同的數據集,因此您將生成三次相同的圖形。 這是因為數據步驟中唯一取決於宏變量I
值的是名稱。
當前您正在選擇變量ID
與變量I
匹配的觀察值。 也許您打算選擇變量ID
與%DO
循環中使用的宏變量匹配的觀察結果?
IF ID = &i;
調試宏代碼的一個技巧是添加語句
options mprint;
這將顯示SAS實際使用的代碼。
例如在日志中:
70 options mprint;
71 %MACRO filter(number);
72 %DO i=1 %TO &number;
73 DATA SUB&i;
74 SET WORK.EXAMPLE;
75 IF ID = &i;
76 PROC SGPLOT DATA=SUB&i;
77 reg x=DATE y=VALUE;
78 RUN;
79 %END;
80 %mend filter;
81
82 %filter(2);
MPRINT(FILTER): DATA SUB1;
MPRINT(FILTER): SET WORK.EXAMPLE;
MPRINT(FILTER): IF ID = 1;
NOTE: There were 9 observations read from the data set WORK.EXAMPLE.
NOTE: The data set WORK.SUB1 has 3 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time 0.03 seconds
cpu time 0.01 seconds
MPRINT(FILTER): PROC SGPLOT DATA=SUB1;
MPRINT(FILTER): reg x=DATE y=VALUE;
MPRINT(FILTER): RUN;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.