2013-07-15 184 views
0

我使用選項在我的sas代碼中創建了兩個宏變量。修改SAS中的宏變量的值

data sasdata1.dataone; 
set sasdata1.dataone ; 
%let week=1; 
%let sum=0; 
do i=1 to 53; 
%let sum= _W&week._NRX + &sum.; 
week=&week+1; 
end; 
drop i; 
week=&week; 
sum=&sum.; 
run; 

即使在循環執行後,周變量的值仍爲1。哪一個是改變宏變量值的正確方法?

+2

我認爲您需要重新閱讀關於宏變量分辨率的doco,以及SAS令牌如何編譯和編譯代碼。有幾個問題,最主要的是你不能在開放代碼中這樣做,但是你可以在宏的上下文中使用'%do&week = 1%到53; <做某事>; %端;'。另一個問題(用你發佈的示例代碼)是,你使用'i'作爲你的迭代器變量,但試圖增加一個名爲'week'的變量。 – sasfrog

+0

好的..我可以在do循環中做些什麼來修改宏變量嗎? – user1946152

+0

你能否提供更多關於你在循環中做什麼的細節。你當前的語法是不正確的,但是我猜測你已經過了複雜的問題(即你希望宏變量周的值與循環變量i相同)。我們需要看看你如何在循環中使用這兩個值。 – Longfish

回答

6

如果你一週的變量都是旁邊的數據集對方,你可能要考慮宏觀的少的辦法:

data sasdata1.dataone; 
    set sasdata1.dataone; 
    sum = sum(of _W1_NRX--_W53_NRX); *double dash means that the columns are next to each other with _W1_NRX as first and _W53_NRX as last; 
run; 

如果你一週的變量與週數結束了,他們甚至不需要彼此相鄰:

data sasdata1.dataone; 
    set sasdata1.dataone; 
    sum = sum(of _W1-_W53); *single dash implies that the suffix is numerically increasing; 
run; 

清潔和容易。

+0

+1 @Shorack你恰好在恰當的時間到達,一旦解決方案中宏的不必要存在已被仔細檢查並排除:) – sasfrog

+0

非常感謝Shorack.This正是我一直在尋找 – user1946152

4

下面是一個快速示例,顯示如何在宏的上下文中執行此操作。運行這個,你可以在日誌中看到發生了什麼。

* 'week' is in scope within the macro only 
    and iterates because of %do loop (no need 
    to explicitly increment it ; 
%macro test1; 
    %do week=1 %to 10; 
    %put &week; 
    %end; 
%mend; 

%test1 

* sum has global scope ; 
%let sum=0; 
* 'week' acts as per test1 above, but we 
    explicitly manipulate 'sum' within each iteration ; 
%macro test2; 
    %do week=1 %to 10; 
    %let sum=%eval(&sum+&week); 
    %put in macro: week is &week, sum is now &sum; 
    %end; 
%mend; 

%put before macro executes, sum is &sum; 

%test2 

%put after macro executes, sum is now &sum;