二. PROC REPORT
1. 基本形式:
PROC REPORT NOWINDOWS;
COLUMN variable-list;
RUN;
如果不寫NOWINDOWS,SAS會打開交互性REPORT窗口;
COLUMN命令:告訴SAS哪些變量以什麼順序被包含。(類似於PROC PRINT 的VAR 命令),如果不寫這個命令,SAS會默認把數據集中所有變量納入。
如果COLUMN命令中至少有一個分類變量,結果會輸出每行一個觀測的表格;如果COLUMN命令中全部都是數值變量,SAS默認會把這些變量進行加和,輸出加和結果。
實例:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN married boy black weight;
RUN;
結果見下:
因爲列出的4個變量都屬於數值型變量,因此SAS默認將他們進行了求和操作;
2. DEFINE命令
DEFINE命令是PROC REPORT 中的基本命令,其基本形式爲:
DEFINE var-name / options 'column-header';
實例,查看不同性別,種族和婚姻狀態下的嬰兒出生體重綜合。代碼如下:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN boy married black weight;
DEFINE boy / GROUP 'Gender/0=female';
DEFINE married / GROUP 'married/0=unmarried';
DEFINE black / GROUP 'Racial/1=black racial';
DEFINE weight / ANALYSIS 'Sum of/Infant birth weight';
RUN;
其中
1)對變量weight的定義行可以省略,因爲weight爲連續變量,SAS默認會對其進行加和操作;
2)GROUP聲明以下的操作按照組別變量的不同取值分別進行(求和)
3)變量表頭中的 / 起到了回車的作用
結果如下:
在DEFINE的options當中,其中兩個很重要的就是GROUP和ACROSS選項,GROUP產生行分組,而ACROSS產生列分組。
1)對於GROUP,簡單地在DEFINE中聲明即可;
DEFINE var / GROUP 'var-header';
2)對於ACROSS, 默認情況下它產生的單元格是計數結果,而非加和結果。要想得到ACROSS variable的加和結果,必須告訴SAS要對哪個變量進行加和。
下面的例子,對boy變量進行ACROSS聲明,代碼見下:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN married black boy, weight;
DEFINE boy / ACROSS 'Gender/0=female';
DEFINE married / GROUP 'married/0=unmarried';
DEFINE black / GROUP 'Racial/1=black racial';
RUN;
其中
1)將boy變量定義爲ACROSS變量(DEFINE boy / ACROSS), married和black定義爲行分組變量(GROUP)
2)COLUMN命令中,boy, weight表明:以逗號左邊的ACROSS變量爲準,對逗號右邊的數值變量weight進行加和報告。
結果如下:
3. BREAK和RBREAK
BREAK的用法和PROC TABULATE中的ALL用法類似,用於在指定變量的每一個變量值之前/之後都生成一個BREAK(具體內容由option指定)。
RBREAK的用法稍有不同,RBREAK不指定變量,因爲RBREAK在整個PROC REPORT過程中只生成一次(除非你指定了BY-group變量,此時RBREAK將在by-group變量的每一個變量值前/後都生成一個break【變得和BREAK相似了,但作用範圍是不同的】)
基本形式爲:
BREAK location variable / options;
RBREAK location / options;
其中
1)location可以爲BEFORE 或者 AFTER,指示BREAK插入的位置;
2)variable指定BREAK的變量;
3)options: 常用的有PAGE(開始新的一頁)以及SUMMARIZE(獲得加和值:小計)
示例:在上面例子的基礎上,想以婚姻狀態爲分組,獲得每個婚姻狀態的出生體重綜合“小計”,並在報告的最後獲得“總計”。代碼如下:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN married black boy, weight;
DEFINE boy / ACROSS 'Gender/0=female';
DEFINE married / GROUP 'married/0=unmarried';
DEFINE black / GROUP 'Racial/1=black racial';
BREAK AFTER married / SUMMARIZE;
RBREAK AFTER / SUMMARIZE;
RUN;
結果如下:
4. 在PROC REPORT 中添加描述性統計量
與PROC TABULATE相似,PROC REPORT也可以輸出相同的描述性統計量(見上一篇文章SAS learning_4: 統計報表製作(1)——PROC TABULATE)。但與TABULATE不同的是,REPORT中變量與keywords的連接符號不是星號(*),而是逗號(,)。
基本形式:
COLUMN var, keywords N;
衆多描述性統計量中,N較爲特殊,它不需要用逗號與任何變量連接,直接列在變量之間即可,表示對於輸出的每一行報告,輸出對應的觀測數。
對於複雜的組合,以括號括起來:
COLUMN (var1 var2), keyword1 var3,(keyword2, keyword3) ;
示例:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN married black N boy, weight,MEAN;
DEFINE boy / ACROSS 'Gender/0=female';
DEFINE married / GROUP 'married/0=unmarried';
DEFINE black / GROUP 'Racial/1=black racial';
RUN;
注意,boy,weight表示boy爲交叉變量,weight,MEAN表示生成weight的均數統計量。
結果如下:
小技巧:N放在group變量後邊,表格編排會更好看~
5. 在PROC REPORT 中新建計算變量
計算新的變量需要在COMPUTE-ENDCOMP中進行,可以在其中進行基本運算,IF-THEN判斷和DO循環。計算得到的變量可以在DEFINE中聲明,也可以不聲明。但聲明時,需要用/COMPUTED加以註釋。
基本形式:
DEFINE new-variable-name / COMPUTED;
COMPUTE new-variable-name / options;
programming statements;
ENDCOMP;
1)計算連續變量:比較簡單,需要注意一點:當使用變量的描述統計量進行計算時,要求這個統計量必須在COLUMN中有過聲明(即:在報告表格中有這一列出現。eg:COLUMN中有age.MEAN,但沒有age.SUM, 在計算時就不能使用age.SUM, 只能使用age.MEAN)
DEFINE var3 /COMPUTED;
COMPUTE var3;
var3 = var1.mean + var2.sum;
ENDCOMP;
2)計算字符變量:需要在變量名後增加 /CHAR選項,還可以指定LENGTH = 字符長度;
DEFINE var3 /COMPUTED;
COMPUTE var3 / CHAR LENGTH = 3;
IF var1 = 'yes' then var3 = 'no';
ELSE var3 = 'not clear';
ENDCOMP;
示例:
PROC REPORT DATA = Sashelp.Bweight NOWD;
COLUMN married N (weight momwtgain),mean weightratio healthygain;
DEFINE married / GROUP 'married/0=unmarried';
DEFINE weightratio / COMPUTED 'MOMweightGain/infantweight';
DEFINE healthygain / COMPUTED;
COMPUTE weightratio;
weightratio = weight.mean/momwtgain.mean;
ENDCOMP;
COMPUTE healthygain / CHAR LENGTH= 3;
IF momwtgain.MEAN GE 5 THEN healthygain = 'no';
ELSE IF momwtgain.MEAN LT 5 THEN healthygain = 'yes';
ENDCOMP;
RUN;
結果如下:
至此,PROC REPORT的學習筆記到此結束,其功能遠遠不止這些,深知自己還有很多地方需要去學習。之後會不定時根據自己新學到的細節加以補充。