簡體   English   中英

SAS中的宏循環-將值傳遞給條件

[英]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和輸出數據集SUB1SUB2SUB3 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.

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