通過TABULATE過程制作匯總報表
制作基本匯總報表
TABULATE過程的基本語法如下:
PROC TABULATE DATA=數據集 <選項>; CLASS 變量1 <變量2變量3 …>; VAR變量4 <變量5變量6 …>; TABLE <<頁表達式,> 行表達式,> 列表達式</選項>; RUN;
其中:
- ·CLASS語句中的變量稱為分類變量,依據分類變量的不同取值可以將數據集中的觀測划分為不同的分組類別。針對這些分組類別,PROC TABULATE分別計算分析變量(后面會講到)的統計量。數值型和字符型的變量都可以作為分類變量,但通常類別(分類變量的取值個 數)不宜太多。
- ·VAR語句中的變量稱為分析變量,這些變量的值就是進行分析計算的對象。只有數值型變量才可以作為分析變量。為了使匯總報表有意 義,通常要求分析變量的求和或平均等計算是有實際含義的。
- ·TABLE語句是用來定義表格布局的,通過TABLE語句可以定義匯總表格的列、行和頁3個維度的布局。在一個TABLE語句中列表達式是 必須的,其余表達式可以省略,但是順序必須依次是頁表達式、行表達 式、列表達式,各表達式中間用逗號(,)分隔。每個維度的表達式由 操作符和元素組成。操作符包括空格操作符和星號(*)操作符,元素 包括分析變量、分類變量、通用的分類變量ALL、統計量、輸出格式和標簽等。
下面將具體介紹如何使用操作符和元素。 以下程序是使用TABLE語句的簡單示例,在定義一個三維的匯總表格后,系統將根據Dept的取值把匯總表格分頁,以Emp_Name的取值 作為行,以Amount的取值作為列。
table Dept, Emp_Name, Amount;
一個TABULATE過程中可以有多個CLASS語句、VAR語句和TABLE語句。
- 在TABULATE過程中,任何一個變量都只能是分類變量或分析變量,但不可以既作為分類變量又作為分析變量。
- TABLE語句中出現的任何變量都必須在CLASS語句或者VAR語 句中出現過。
- 所有分析變量必須出現在一個維度(列、行或者頁)中,也就 是說,僅有一個維度的表達式中包含分析變量。
在使用TABULATE過程制作報表前,必須根據所要顯示的內容明確以下4個問題:
- ·什么變量作為分類變量。
- ·什么變量作為分析變量。
- ·需要計算什么統計量。
- ·用什么樣的表格展示結果。
接下來將按照以上的思路結合例子來介紹如何使用TABULATE過程制作報表。
在本節中將使用數據集ex.sales_halfyear作為示例數據,該數據集中含有以下字段:員工工號(Emp_ID)、員工姓名(Emp_Name)、州(State)、銷售月份(Month)、銷售數量(Sales)、銷售價格(Price)、產品類型(Type)、Amount(銷售金額)。部分數據如圖
使用TABULATE過程制作一個簡單表格,顯示每個州的交 易次數。
分析:這里的分類變量為State,交易次數是頻數統計量,那么分類變量的默認統計量就是頻數統計量。以下代碼可以實現上述功能:
proc tabulate data=ex.sales_halfyear; title1 'Sales in North America'; title2 'Trancations in Each State'; class state; table state; run;
- ·CLASS語句中定義了一個分類變量state,當TABLE語句使用變量state時,state的每個取值將成為一個分組類別。
- ·如果TABLE語句中只指定了一個表達式state,則這個表達式作為列表達式,state的每個取值將在表格中作為一列。
- ·當沒有定義分析變量時,在表格中顯示的統計量默認為頻數統計 量N。
- ·TITLE語句是全局語句,這里定義兩級標題,可以參考PRINT過程 中的介紹。
1.分類變量中含有缺失值
如果分類變量中含有缺失值,在匯總時系統會自動刪除分組變量為 缺失值的觀測。在PROC TABULATE中使用選項MISSING,可以將缺 失值作為一個特定的類別在報表中顯示出來。使用方法如下:
PROC TABULATE DATA=數據集 MISSING;
當選項MISSING使用在PROC TABULATE語句中時,會對所有CLASS語句中的分類變量都起作用。第一次對某個數據集使用 TABULATE過程時,最好能先在PROC TABULATE語句中使用選項 MISSING,這樣能對數據集中的各變量是否存在缺失值有比較全面的了 解。
在制作報表過程中,如果只需要將特定變量的缺失值在報表中顯 示,可以在CLASS語句中使用選項MISSING。語法如下:
CLASS 變量1 <變量2 … >/MISSING;
這時選項MISSING只對該CLASS語句中的變量起作用,如果 TABULATE過程中還有其他CLASS語句,選項MISSING對其他變量不 起作用。
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Trancations in Each State'; class state/missing; table state; run;
使用TABULATE過程制作一個簡單表格,顯示每個州的交易金額。
分析:這里的分類變量是State,分析變量是Amount,使用求和統 計量,在設計表格的時候,可以將State的取值設為行,交易金額的和設 為列,這樣就不難寫出代碼了。代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales in North America'; title2 'Total Amount Sold in Each State'; class state; var amount; table state,amount; run;
在TABLE語句中,分類變量State定義為行維度,State的每個取值 在報表中為一行;分析變量amount定義為列維度,這里沒有為amount指定特定的統計量,系統使用默認的SUM統計量。
使用TABULATE過程制作一個簡單表格,顯示每種產品在每個州的交易金額,並將不同的產品分頁展示。
分析:這里的分類變量有兩個,分別是State和Type,分析變量是 Amount,使用求和統計量,這里需要使用Type來分頁,將State取值設 為行,交易金額的和設為列。示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales in North America'; title2 'Total Amount Sold in Each State for Each Type'; class state type; var amount; table type,state,amount; run;
以上匯總表格中每種產品分屬不同的頁,每頁中顯示每個州的交易 金額總和,列的名稱包含了分析變量Amount和統計量SUM。
2. 制作高級匯總報表
在上面的介紹中,TABLE語句的每個維度都只有一個分類變量或分析變量。事實上,在TABLE語句中可以使用更為復雜的維度表達式來制作匯總報表。
1.使用空格操作符制作連排表格
在TABLE語句的表達式中,使用空格操作符隔開兩個元素可以制作連排表格。
使用TABULATE過程制作一個匯總表格,顯示每個州的交易數量及每個月的交易數量。
分析:這里的分類變量為State和Month,使用頻數統計量,可以考慮制作連排表格。示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales in North America'; title2 'Total Transactions'; class state month; table state month; run;
在輸出結果中,state和month的取值共同構成了匯總表格的列。
2.使用星號(*)操作符制作交叉組合表格
在TABLE語句中,可使用星號(*)操作符隔開兩個元素制作交叉組合表格。
使用TABULATE過程制作一個匯總表格,顯示每種產品在 每個州的銷售金額總和。
分析:分類變量為State和Type,分析變量為Amount,使用求和統 計量。示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales in North America'; title2 'Total Amount Sold For Each Type In Each State'; class state type; var amount; table type*state,amount; run;
表達式type*state表示行維度,type在星號(*)操作符的左邊,因 此在匯總表格中type位於state的左邊。
3.使用關鍵字ALL
關鍵字ALL可以使用在TABLE語句的頁、行、列表達式中,它可以 作用在一個或者多個分類變量上。ALL可以理解為一個特殊的分組類 別,這個類別中包含所作用變量的所有分組類別內的全部觀測。
使用關鍵字ALL修改例5.15中的程序,顯示每種產品在每 個州的銷售總和及所有產品在所有州的銷售總和。
示例代碼如下:
proc tabulate data=ex.sales_halfyear; title 'Type*State All'; class state type; var amount; table type*state all,amount; run; proc tabulate data=ex.sales_halfyear; class state type; var amount; title 'Type*(State All)'; table type*(state all),amount; run;
為了介紹關鍵字ALL,這里分別制作了兩個匯總表格。
- ·左邊的表格:關鍵字ALL作用在type*state之后,ALL相當於和 type*state一樣的一個類別,最后一行的類別顯示為ALL(全部),表示 計算所有產品在所有州的銷售總和。
- ·右邊的表格:關鍵字ALL只作用在state上,相當於是state的一個特殊類別,所以在每個State的所有類別之后,都有一行顯示為ALL(全 部),用於計算某種產品在所有州的銷售總和。
4.統計量
在上面的例子中,使用的都是系統默認的統計量,其中分類變量的 默認統計量是頻數統計量N,分析變量的默認統計量是求和統計量 SUM。除了頻數統計量和求和統計量,TABULATE中還可以計算許多 其他統計量。表5.3中是部分較為常見的統計量的關鍵字。
常見統計量關鍵字
前面介紹過,在一個TABLE語句中,所有分析變量必須出現在一個維度中,也就是說,只有在一個維度的表達式中才會包含分析變量。同樣的,所有的統計量也必須出現在一個維度中,但是分析變量和統計量可以分別出現在不同的維度中。
使用TABULATE過程制作一個匯總表格,顯示每種產品在 每個州的交易次數、平均銷售金額、銷售金額總和。
分析:分類變量為Type和State,分析變量為Amount,統計量為頻 數(N)、平均值(MEAN)和求和統計量(SUM)。示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales Report in North America'; class state type; var Amount; table type*state all,amount*n amount*mean amount; run;
這里使用了多個統計量N、MEAN和SUM。表達式amount*n amount*mean amount可以使用括號操作符寫成amount*(n mean sum)。
3. 改進報表顯示
上面已經介紹了TABULATE過程的用法,下面將進一步介紹如何使用其他的語句、選項及關鍵字,使得輸出的報表更為用戶化,且具有 可讀性。主要包括以下幾個方面:
- ·添加標題和腳注
- ·規定變量或統計量標簽
- ·控制分類變量輸出類別
- ·控制匯總數據的輸出格式 在TABULATE過程中,標題和標注的使用方法和在PRINT過程中類似,這里不贅述。
1.規定變量或統計量標簽
在使用TABULATE過程制作匯總表格時,若數據集中已經為變量 設立了標簽,則在匯總表格中,行或列的表頭中將顯示其標簽而非變量名。如果數據集中的變量沒有定義標簽,或者在報表中需使用不同於數 據集中已有標簽的形式,則可以使用以下兩種方法定義變量的標簽。
- ·使用LABEL語句定義標簽,使用語法和PRINT過程中類似。
- ·在TABLE語句中使用以下語法改寫變量名:變量='標簽' 其中變量包括通用分類變量ALL。如果不需要某個變量的名稱出現 在匯總表格中,則可以將這里的'標簽'置為''。
將匯總表格中的變量都使用中文標簽顯示。 示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 'Sales Report in North America'; class state type; var amount; table type='產品類型'*state all='匯總',amount=''*(n mean sum); label state='州'; run;
若要對匯總表格中的統計量名稱進行更改,類似於變量標簽的設 定,可以使用以下兩種方法中的任意一種實現。
- ·使用KEYLABEL語句定義標簽,相關語法如下:KEYLABEL 統計量關鍵字1='統計量標簽1' 統計量關鍵字2='統計量標簽2';
- ·在TABLE語句中使用以下語法改寫變量名:統計量關鍵字='統計量標簽'
將匯總表格中的統計量改為中文名稱。 示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 '北美銷售概況'; title2 '產品類型和季度角度分析'; class state type; var amount; table type='產品類型'*state all='匯總',amount=''*(n='銷售次數' mean='平均銷售金額' sum='銷售金額之和'); label state='州'; run;
在上述程序中,實現了將統計量N、MEAN及SUM分別用中文標簽 顯示。
2.使用FORMAT語句控制分類變量的類別
在TABULATE過程中,可以使用FORMAT語句控制分類變量的類 別。使用語法如下:
FORMAT 變量1 <變量2 …> 輸出格式1 <變量3 輸出格式2…>;
對分類變量使用FORMAT語句后,將按格式化后的值進行分類,同 時,在匯總表格中顯示的類別也是變量格式化后的取值。
顯示使用TABULATE過程制作一個匯總表格,顯示每種產 品每個季度的銷售次數、平均銷售金額、銷售金額總和。
在數據集ex.sales_halfyear中沒有季度字段,可以對變量month使用 用戶自定義格式$quarter。
示例代碼如下:
proc format; value quarter 1-3='季度1' 4-6='季度2' 7-9='季度3' 10-12='季度4'; run; proc tabulate data=ex.sales_halfyear; title1 '北美銷售概況'; title2 '產品類型和季度角度分析'; class type month ; var amount; table type='產品類型'*(month all='半年匯總') all='匯總' ,amount=''*(n mean='平均銷售金額' sum='銷售金額之和'); format month quarter.; keylabel n='銷售次數'; run;
這里運用FORMAT過程定義了輸出格式quarter,將month=1、2、3 歸為季度1,month=4、5、6歸為季度2,所以在輸出報表中,我們看到 month的取值變成季度1和季度2(數據集中只有上半年的數據),並且 分類匯總也是在此基礎上進行的。
接下來,將對FORMAT過程進行簡要介紹。
SAS系統提供的FORMAT過程專門供用戶自定義輸入與輸出格式。 通過FORMAT過程,用戶可以自己設定輸出格式,對變量的不同值或者 不同范圍的值可設定不同的“標簽”來顯示,從而增加數據集和報表的可 讀性。涉及的語法如下:
PROC FORMAT; VALUE 格式名稱 范圍1='標簽1' RUN; 范圍2='標簽2' …;
其中,格式名稱是長度不超過8位的SAS變量名,但是不能以數字結尾,也不能和系統已有的輸出格式重名。若為字符型的輸出格式,格式名稱必須以DOLLAR符號($)開始,包括DOLLAR符號在內不能超 過8個字符。
以下程序定義了兩個輸出格式。
proc format; value $gender 'M'='Male' 'F'='Female' Other='Wrong Code'; run; proc format; value $grade Low-59='Under Grade' 60-80='Average' 81-90='Good' 91-High='Excellent'; run;
在上述程序中,OTHER表示除了列舉范圍以外的所有值,包含缺 失值,一般使用在字符型輸出格式中;LOW表示最小的數值,包含缺 失值;HIGH表示最大的數值。
用戶自定義的輸出格式和系統自帶的輸出格式使用方法一樣。 如果沒有指定邏輯庫,則FORMAT過程定義的輸出格式保存在圖中下的位置,一經定義后,即可一直調用,但是由於是保存在臨時庫中的,因此一旦關閉SAS會話,它就會被刪除。
為了使得定義的FORMAT能夠保存下來,可在以后的SAS會話中被 調用,可以在定義FORMAT的時候如下指定邏輯庫:
PROC FORMAT LIBRARY=邏輯庫名;
這樣一來,定義好的FORMAT就會被保存到該邏輯庫中的 FORMATS目錄下。選項LIBRARY=缺省時,FORMAT會被默認保存到 WORK邏輯庫中的FORMATS目錄下。
為了方便用戶在以后的SAS會話中直接調用已經定義的FORMAT,SAS提供了一個系統選項FMTSEARCH,用於搜索指定的邏輯庫及目錄下面的FORMAT。選項FMTSEARCH的使用方法如下:
OPTIONS FMTSEARCH=(邏輯庫名1 <邏輯庫名2 … >);
例如:
Options fmtseatch=(abc xyz);
在上面的例子中,系統會首先搜索WORK.FORMATS,然后再依次 搜索ABC.FORMATS和XYZ.FORMATS,直到找到需要的FORMAT。 如果用戶希望系統優先使用ABC邏輯庫中的FORMAT,可以在 OPTIONS語句中如下設置:
options fmtseach=(abc work xyz);
如此一來,系統就會依次搜索ABC.FORMATS、WORK.FORMATS、XYZ.FORMATS,直到找到需要的FORMAT。 關於FORMAT過程更加詳細的介紹及用法請參考SAS幫助文檔。
3.控制匯總數據的輸出格式
在TABULATE過程中,有以下兩種方法可以控制匯總數據的輸出格式:
- ·在TABLE語句的變量(或變量標簽)或統計量(或統計量標簽) 后面可使用下面語法控制行或列的輸出格式。*F=輸出格式
- ·在PROC TABULATE語句中使用選項FORMAT=,這時指定的格式 將作為所有匯總數據的輸出格式,除非某些行或某些列指定了特定的輸 出格式。
將匯總數據的銷售額用輸出格式dollar12.2顯 示。
示例代碼如下:
proc tabulate data=ex.sales_halfyear; title1 '北美銷售概況'; title2 '產品類型和季度角度分析'; class type month; var amount; table type='產品類型'*(month all='半年匯總') all='匯總',amount=''*(n='銷售次數'mean='平均銷售金額'*f=dollar12.2 sum='銷售金額之和' *f=dollar12.2); format month quarter.; run;
上述程序中,用“*F=輸出格式”分別為平均銷售金額和銷售金額之 和的匯總數據設定了輸出格式。