2016-09-20 95 views
1

我有一個數據集是這樣;如何使用算術運算符與SAS宏變量

DATA work.faminc; 
    INPUT famid faminc1-faminc12 ; 
CARDS; 
1 3281 3413 3114 2500 2700 3500 3114 3319 3514 1282 2434 2818 
2 4042 3084 3108 3150 3800 3100 1531 2914 3819 4124 4274 4471 
3 6015 6123 6113 6100 6100 6200 6186 6132 3123 4231 6039 6215 
; 
RUN; 

我可以創建一個變量,並做一些東西與它類似,

%let N=12; 

DATA faminc1b; 
    SET faminc ; 

    ARRAY Afaminc(12) faminc1-faminc12 ; 
    ARRAY Ataxinc(&N) taxinc1-taxinc&N ; 
    DO month = 1 TO &N; 
    Ataxinc(month) = Afaminc(month) * .10 ; 
    END; 
RUN; 

但我也想分裂每個家庭的收入面前的一個。

的結果應該是像faminc1/faminc2 - faminc2/faminc3 - faminc3/faminc4 ...

所以,主要的問題是如何使用算術運算(+, - ,*,/)運營商的 「N」我創建的變量。

當我試圖簡單地做到這一點,它不工作;

%let N=12; 

DATA faminc1b; 
    SET faminc ; 

    ARRAY Afaminc(12) faminc1-faminc12 ; 
    ARRAY Afamdiv(&N) famdiv1-famdiv&N ; 
    DO month = 1 TO &N+1; 
    Afamdiv(month) = faminc&N/faminc&N+1 ; 
    END; 
RUN; 

感謝您的幫助。

回答

1

我不完全確定你想達到什麼,所以我只能回答你關於宏變量操作的問題,爲了讓你的示例工作,你應該把它放在一個單獨的宏,然後你可以做eval函數在你的宏變量上添加1.

但據我所知,你必須使用月份作爲你的循環變量而不是N,你也必須停在11,因爲你沒有一個變量13與變量12相除

%let N=12; 
%macro calc; 
DATA faminc1b; 
    SET faminc ; 

    ARRAY Afaminc(12) faminc1-faminc12 ; 
    ARRAY Afamdiv(&N) famdiv1-famdiv&N ; 
    %DO month = 1 %TO %eval(&N-1); 
    Afamdiv(&month) = faminc&month/faminc%eval(&month+1) ; 
    %END; 
RUN; 
%mend; 
%calc; 
+0

這正是我所期待的。感謝您的幫助 – kutayatesoglu

0

除了定義變量的上限之外,您不需要使用宏變量名單。

您可以使用正常SAS代碼執行的其他操作。使用DIM()函數查找上限數組。在你的計算中使用數組。不知道你爲什麼要硬編碼一個上限,併爲另一個上限使用宏變量,但如果他們可以不同,那麼你需要考慮兩個數組的長度來找到DO循環的上限。

%let N=12; 

DATA faminc1b; 
    SET faminc ; 
    ARRAY Afaminc faminc1-faminc12 ; 
    ARRAY Afamdiv famdiv1-famdiv&N ; 
    DO month = 1 TO min(dim(afaminc)-1,dim(afamdiv)); 
    Afamdiv(month) = afaminc(month)/afaminc(month+1) ; 
    END; 
RUN; 
+0

我硬編碼一個上限的唯一原因是因爲我更新了其他一些我以前做過的代碼,並且要求改變。你是對的,兩個上限都是一樣的,所以我會把它們引用到宏變量中。 你的代碼也很好地工作謝謝你展示另一種方式來做到這一點。 – kutayatesoglu