以下介紹的範例取材自已絕版的『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

【結果三】

Obs    prodid    salesum
1       A         570
2       B         475
3       C         610
創作者介紹
創作者 estat 的頭像
estat

blog.estat.com.tw

estat 發表在 痞客邦 留言(0) 人氣()