作者MaILmoViEe (...)
看板Statistics
标题[程式] SAS的DO END跟LAG的问题
时间Tue Dec 1 22:44:41 2015
[程式] 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://webptt.com/cn.aspx?n=bbs/Statistics/M.1448981084.A.864.html
※ 编辑: MaILmoViEe (114.36.178.191), 12/01/2015 22:45:42