[程式] SAS的DO END跟LAG的問題
[程式] SAS
[軟體程式類別]:SAS
[程式問題]:
LAG 跟雙重DO END的問題
[軟體熟悉度]:
新手
[問題敘述]:
我根據別人給我的程式去改
想在中間NAME那邊用DO END來解決但出問題
[程式範例]:
以下是我原始寫的程式
data score;
input name $ subject $ score 2.;
cards;
John Chem 75
John Math 32
John Eng 31
Mary Phsy 11
Mary Eng 99
Mary Math 65
Mary Chem 76
Sam Chem 55
Sam Phsy 33
Pig Math 98
;
data tran;set score;
array aa[*] Chem Math Eng Phsy;
array bb[*] Chem2 Math2 Eng2 Phsy2;
array cc[*] Chem3 Math3 Eng3 Phsy3;
array dd[*] Chem4 Math4 Eng4 Phsy4;
array ee[*] Chem_Sum Math_Sum Eng_Sum Phsy_Sum;
if subject="Chem" then do i=1;end;
if subject="Math" then do i=2;end;
if subject="Eng" then do i=3;end;
if subject="Phsy" then do i=4;end;
do k=1 to 4;
if i=k then aa[k]=score;
if name="John" then bb[k]=lag(aa[k]);
if name="John" then cc[k]=lag(bb[k]);
if name="John" then dd[k]=lag(cc[k]);
if name="Mary" then bb[k]=lag(aa[k]);
if name="Mary" then cc[k]=lag(bb[k]);
if name="Mary" then dd[k]=lag(cc[k]);
if name="Sam" then bb[k]=lag(aa[k]);
if name="Sam" then cc[k]=lag(bb[k]);
if name="Sam" then dd[k]=lag(cc[k]);
if name="Pig" then bb[k]=lag(aa[k]);
if name="Pig" then cc[k]=lag(bb[k]);
if name="Pig" then dd[k]=lag(cc[k]);
ee[k]=MAX(aa[k],bb[k],cc[k],dd[k]);end;
run;
proc sort data=tran out=tran222;by name;run;
data try_lag(keep=name Chem_Sum Math_Sum Eng_Sum Phsy_Sum);set tran222;by name;
if last.name;run;
但我覺得中間那段DO END的NAME 太長
想要改成
data score;
input name $ subject $ score 2.;
cards;
John Chem 75
John Math 32
John Eng 31
Mary Phsy 11
Mary Eng 99
Mary Math 65
Mary Chem 76
Sam Chem 55
Sam Phsy 33
Pig Math 98
;
data tran;set score;
array aa[*] Chem Math Eng Phsy;
array bb[*] Chem2 Math2 Eng2 Phsy2;
array cc[*] Chem3 Math3 Eng3 Phsy3;
array dd[*] Chem4 Math4 Eng4 Phsy4;
array ee[*] Chem_Sum Math_Sum Eng_Sum Phsy_Sum;
if subject="Chem" then do i=1;end;
if subject="Math" then do i=2;end;
if subject="Eng" then do i=3;end;
if subject="Phsy" then do i=4;end;
if name="John" then do w=1;end;
if name="Mary" then do w=2;end;
if name="Sam" then do w=3;end;
if name="Pig" then do w=4;end;
do k=1 to 4;do r=1 to 4;
if i=k then aa[k]=score;
if w=r then bb[r]=lag(aa[r]);
if w=r then cc[r]=lag(bb[r]);
if w=r then dd[r]=lag(cc[r]);
ee[r]=MAX(aa[r],bb[r],cc[r],dd[r]);end;end;
run;
proc sort data=tran out=tran222;by name;run;
data try_lag(keep=name Chem_Sum Math_Sum Eng_Sum Phsy_Sum);set tran222;by name;
if last.name;run;
但結果跟原來的卻差很遠 想詢問雙重甚至三重DO END在LAG的應用
我雖然有用PROC SQL跟TRANSPOSE去完成目的
但還是想詢問LAG跟雙重DO END的用法
請前輩指教
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.178.191
※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1448981084.A.864.html
※ 編輯: MaILmoViEe (114.36.178.191), 12/01/2015 22:45:42