以下介紹的範例取材自已絕版的『SAS 程式技巧』(作者:陳坤芳; 1996 頁6-12~6-13)中的一段程式應用,主要的指令為RETAIN搭配FIRST.VARIABLE、LAST.VARIABLE,所要執行的任務為『分組資料的加總』,在之前的部落文─『SAS中的描述性統計: PROC MEANS指令』曾提到以描述性統計的語法:PROC MEANS計算分組的描述性統計量,有興趣,可以比較兩種方法的差異。
【程式一】中,建立了9筆資料,prodid為產品編號,sales為銷售額。
【程式一】
data prod;
input prodid $ sales@@;
cards;
C 200 B 160 C 190 B 150
A 250 B 65 A 110 C 70
C 150 A 90 A 120 B 100
;
proc sort;
by prodid;
proc print;
run;
【結果一】
Obs prodid sales
1 A 250
2 A 110
3 A 90
4 A 120
5 B 160
6 B 150
7 B 65
8 B 100
9 C 200
10 C 190
11 C 70
12 C 150
【程式二】中,retain salesum語法的撰寫目的,在宣告產生salessum的累進值,salessum的起始值為0。但累進並非由第一筆累進到最後一筆,係根據每個產品編號(prodid)的第一筆,累進至每個產品編號(prodid)的最後一筆。因此,累進的依據是產品編號(prodid),故在retain salesum語法下緊接著寫下by prodid。但如何辨識每個產品編號(prodid)的第一筆?則需透過first.variavle 語法,在本例中,以if first.prodid表示每個產品編號(prodid)的第一筆,且在第一筆的情況下,salesum(銷售額)為0,且salesum(銷售額)的累進值為0+第一筆的銷售額(sales),再繼續累加至第二筆,以及第三筆,以此類推。以產品編號A為例,最後的累進值為570。累進的過程如【結果二】。
但我們只要最後的累進結果,因此以last.prodid語法,篩選每個產品編號(prodid)的最後一筆,結果即完成,如【結果三】。
【程式二】
data summay(drop=sales);
set prod;
retain salesum;
by prodid;
if first.prodid then salesum=0;
salesum=salesum+sales;
if last.prodid;
proc print;
run;
【結果二】
Obs prodid salesum
1 A 250
2 A 360
3 A 450
4 A 570
5 B 160
6 B 310
7 B 375
8 B 475
9 C 200
10 C 390
11 C 460
12 C 610
【結果三】
留言列表