[程式] SAS的DO END跟LAG的問題

看板Statistics作者 (...)時間8年前 (2015/12/01 22:44), 8年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
[程式] 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
文章代碼(AID): #1MNR9SXa (Statistics)