先看 pseudo code
1. create new file aa;
2. open d as input
3. suppose d 有 r 筆(row)
4. for i=1 to r
5. xxx[i]=vol[i]+VOL[i-1]; * ?????? ;
6. end.
以下是做法.
DATA AA;
SET D;
XXX=VOL+LAG(VOL);
RUN;
有時候算式不是只用LAG就做得到? 這時候要如何做?
如算 "累積報酬": acR[i]=1*(1+R[i-N])*(1+R[i-(N-1)])*(1+R[i-(N-2)])*... *(1+R[1]);
因第一筆的 LAG 為 . (MISSING VALUE), 所以之後就算不出來.
再引進新的 指令 RETAIN; 以RETAIN 定義的可以將值往下一筆傳.
先寫PSEUDO CODE
1. create new file aa;
2. open d as input
3. suppose d 有 r 筆(row)
3.1 ACC=1.0;
4. for i=1 to r
5. ACC[i]=ACC*(1+ R[i]); * ?????? ;
6. accr=acc-1;
7. end.
8. drop ACC
--------------->
[1] DATA AA;
[2] SET D;
[3] RETAIN ACC;
[4] ACC=1.0;
[5] ACC=ACC*(1+R);
[6] ACCR=ACC-1; Drop ACC;
[7] RUN;
但以上的寫法有個問題.
[4],[5]如何區分 PSEUDO CODE 的迴圈內, 或迴圈外?
還好, RETAIN 可以設初始值, 改成以下就OK了.
[1] DATA AA;
[2] SET D;
[3] RETAIN ACC 1.0;
[5] ACC=ACC*(1+R);
[6] ACCR=ACC-1; Drop ACC;
[7] RUN;
另一種寫法: 以下的寫法很重要, 很多稍複雜的問題可以用以下的觀念解決.
引進內部變數 _N_
在第一筆時 做initial
[1] DATA AA;
[2] SET D;
[3] RETAIN ACC;
[4] if (_N_=1) then ACC=1.0;
[5] ACC=ACC*(1+R);
[6] ACCR=ACC-1; Drop ACC;
[7] RUN;
到這裡應可以解決大部分的問題.
如果有新問題可以留下問題, 我們可以交流一些想法.
相關文章:
[Data Step][SAS] INTERAL VARIABLE(內部變數) _N_
留言列表