- SAS統計分析與應用實例
- 劉榮編著
- 4167字
- 2019-01-01 14:47:20
1.3 SAS數據集整理
本章1.2節簡單介紹了SAS的界面,并引入SAS邏輯庫和數據集,詳述了新建邏輯庫的方法,以及數據集文件的復制、刪除等操作。以下介紹SAS數據集的一般操作。
1.3.1 新建數據集
在SAS系統中可以使用編程和Viewtable表的方式新建SAS數據集,并對數據集進行修改、增刪記錄等操作。以下通過例1-1介紹這兩種方法的具體使用。
例1-1 請根據表1-1所示信息新建數據集chap1.example1_1。
表1-1 某公司客戶信息表

方法一:編寫如下程序(其在光盤中的存儲路徑為“proc\chap1\example1_1.sas”)。
libname chap1'E:\data\chap1'; /*新建指向路徑為“E:\data\chap1”的邏輯庫chap1*/ data chap1.example1_1; /*新建永久SAS數據集chap1.example1*/ input ID$1-4 name$5-11 Type$13-19 birth YYMMDD8.+1 N; /*定義變量輸入格式*/ cards; 0101 張三 金卡 64/10/06 20 0102 李四 銀卡 82/09/16 13 0103 王五 普通卡 87/01/27 5 ; /*輸入數據*/ proc print; format birth YYMMDD8.; /*設置變量birth的輸出格式*/ run;
選擇Run|Submit命令提交程序,在Output輸出記錄窗口顯示如圖1-5所示,且在新建的邏輯庫chap1中出現了數據集example1。

圖1-5 結果輸出
注意:日期格式的變量在SAS中默認保存為從1960年1月1日至某日期的天數,如1964年10月6號,默認輸出為1740。在打印輸出日期格式的變量時,為了得到特定格式,務必使用format語句指定輸出格式。而SAS數據集chap1.example1,變量birth也將顯示天數,此時右鍵單擊變量名,在快捷菜單中選擇 Column Attribute(變量屬性),單擊彈出的對話框中的 format后的按鈕,在此可以選擇設置變量的輸出格式。
方法二:Viewtable表新建數據集。
步驟一:打開新表
選擇菜單Tools|Table Editor打開一個新表,如圖1-6所示。

圖1-6 Viewtable表視窗
步驟二:定義變量
右鍵單擊A列,選擇Column Attributes(變量屬性)命令,彈出如圖1-7所示對話框,在Name欄中輸入變量名ID,Type(類型)為默認Character(字符型),Length(長度)為8,Format (輸出格式)和Informat(輸入格式)為$8.(默認設置)。左鍵單擊Apply(應用)按鈕,再單擊Close(關閉)按鈕;或者直接單擊Close按鈕完成第一列姓名變量的屬性設置。

圖1-7 設置變量屬性
重復以上操作,定義變量Name、Type時變量類型(Type)選擇Character,輸出格式(Format)和輸入格式(Informat)選擇默認值$8.;定義變量birth時變量類型(Type)選擇Numeric,Format (輸出格式)和Informat(輸入格式)選擇yy/mm/dd;定義變量 N時變量類型(Type)選擇Numeric, Format(輸出格式)和Informat(輸入格式)選擇默認值$8.。
說明:用戶根據變量性質選擇設置變量類型(Type)為字符型(Character)和數值型(Numeric)。Informat和Format分別代表數據的輸入格式和輸出格式,可單擊格式右側的“…”按鈕設置。在窗口的Label欄中可以輸入變量標簽。若不定義變量標簽,則系統默認變量名為標簽名。打開數據集時,Viewtable 表頭為標簽名,可通過主菜單 View|Columns Labels 和View|Columns Names進行切換。
步驟三:輸入數據、保存數據集
直接在表中輸入相應數據,然后直接單擊工具欄上的保存圖標,或者選擇菜單File|Save,在彈出的對話框中左鍵單擊選擇需要存入的庫名chap1,在Member Name(對象名稱)框中輸入數據集名example1,單擊Save(保存)按鈕保存設置。
若要修改已有數據集的變量標簽,可選擇菜單Editor|Edit Mode(編輯模式)更改系統默認的Browse(瀏覽)模式。
若要更改已存在的數據集變量名,可使用RENAME語句用編程的方式實現,它的一般使用格式如下:
RENAME OLD1=NEW1 OLD2=NEW2 OLD3=NEW3;
注意:建議讀者在觀測和變量不多,數據形式不復雜的情形下選用編程的方式新建數據集,否則可選擇便捷的Viewtable 表建立SAS 數據集。若是海量數據,則采用從外部數據庫將數據導入SAS系統進行計算的方式。
1.3.2 在數據集中增加、篩選變量和觀測
在DATA步中可以直接利用新建變量語句來產生新變量,篩選變量可使用KEEP/DROP語句, KEEP 語句用來指定需要保留的變量;DROP 語句用來指定被刪除的變量。注意在一個程序里,不能同時使用DROP/KEEP語句。KEEP/DROP語句的語句格式如下(注意:變量間用空格分開):
● KEEP語句格式1:KEEP 變量1 變量2…變量N;
● KEEP語句格式2:DATA=數據集名稱(KEEP=變量1 變量2…變量N);
● DROP語句格式1:DROP變量1 變量2…變量N;
● DROP語句格式2:DATA=數據集名稱(DROP=變量1 變量2…變量N);
在SAS數據集中可使用IF-THEN語句實現篩選觀測。該語句有以下兩種使用格式:
格式一:IF 條件表達式 THEN;
格式二:IF 條件表達式 THEN SAS語句;
<ELSE SAS語句 >;
當我們在創建SAS數據集時使用IF語句的格式之一,可以根據被處理的觀測是否使IF條件表達式為真,來決定是否執行THEN后面的SAS語句。如果條件表達式為假,執行ELSE后面的語句,沒有ELSE語句則執行IF語句的下一條語句。且IF THEN/ELSE語句還可多層嵌套,不過請注意此種語句的程序編寫格式和匹配。
以下通過一個綜合例子來說明以上語句的具體使用。
例1-2 根據表1-2抽查的某班8個學生的體檢結果新建數據集chap1.example1_2,并實現如下操作:
(1)根據身高和體重計算每位學生的體重指數(BMI),已知體重指數等于體重(單位為kg)除以身高(單位為m)的平方。
(2)僅保留學生姓名、BMI和性別。
(3)僅保留體重指數處在正常范圍的學生信息(18<BMI<25)。
表1-2 某班學生體檢抽查結果

注:體重的單位為kg,身高的單位為m。
編寫如下程序(其在光盤中保存路徑為“proc\chap1\example1_2”):
data chap1.example1_2; input ID$1-2 name$3-10 sex$11-12 +1 weight+1 height; cards; 01 姚籽萱 女 50.5 1.63 02 徐若黛 女 51 1.53 03 張林 男 60 1.72 04 謝欣然 女 62 1.70 05 夏天 女 54 1.67 06 劉子然 男 70 1.80 07 趙趙 男 65 1.75 08 章峰 男 84 1.68 ; run; /*以上程序新建了包含了表格的數據集chap2.example1_2*/ /*解答問題A*/ data chap1.example1_2; set chap1.example1_2; BMI=weight/(height**2); /*根據公式計算BMI*/ run; /*解答問題B*/ data chap1.example1_2; set chap1.example1_2; keep ID sex BMI; /*此行也可改寫為drop name weight height;*/ run; /*解答問題C*/ data chap1.example1_2; set chap1.example1_2; if BMI>18&&BMI<25; /*保留BMI在18~25的觀測*/ run;
1.3.3 對數據集排序
數據集的排序可應用SORT過程編程實現,該過程的語法結構如下:
PROC SORT <選項>; BY<DESCENDING> 變量名; RUN;
注意:DESCENDING選項只對隨后的一個變量起作用。如果省略DESCENDING指令,系統將默認指定升序排列。
例1-3 將數據集chap1.example1_2對學生按其BMI的值降序排列,并另存為數據集chap1. example1_3。
編寫如下程序(其在光盤中的存儲路徑為“proc\chap1\example1_3”):
proc sort data=chap1.example1_2 out=chap1.example1_3; /*對數據集chap1.example1_2排序,將結果另存為chap1.example1_3*/ by descending BMI; /*按照BMI的值降序排列,若需要升序排列則將descending改寫成ascending*/ run; proc print data=chap1.example1_3; run;
選擇Run|Submit命令提交程序,打印輸出結果如下:

圖1-8 排序后輸出結果
1.3.4 數據集縱向連接
數據的縱向連接指幾個數據集中的數據縱向相加連接為一個新的數據集,它的記錄數將是原來幾個數據集中記錄數的總和。此操作在DATA步中用SET指令實現。
Set命令的語法格式如下:
set 數據集名稱1 數據集名稱2…數據集名稱n;
例1-4 若已存在數據集chap1.A、chap1.B和chap1.C(內容如表1-3、表1-4和表1-5所示,存儲在光盤中的路徑分別為“data\chap1\A”、“data\chap1\B”、“data\chap1\C”)。
表1-3 數據集A

表1-4 數據集B

表1-5 數據集C

(1)將數據集chap1.A和chap1.B縱向連接成數據集chap1.AB。
(2)將數據集chap1.A和chap1.C縱向連接成數據集chap1.AC。
編寫如下程序(其在光盤中的存儲路徑為“proc\chap1\set”):
data chap1.AB; set chap1.A chap1.B; /*合并數據集chap1.A和chap1.B*/ run; data chap1.AC; set chap1.A chap1.C; /*合并數據集chap1.A和chap1.C*/ run;
選擇Run|Submit命令提交程序,則新建數據集chap1.AB和chap1.AC如表1-6和表1-7所示。
表1-6 數據集chap1.AB

表1-7 數據集chap1.AC

觀察可知,數據集中的同名變量會自動合并(表1-6所示),對于其中不同名的變量,SAS會在缺少相應數值的位置顯示缺失(如表1-7所示)。
1.3.5 數據集橫向合并
數據集的橫向合并是指通過使用 MERGE 語句把兩個及兩個以上數據集中的兩條或兩條以上的觀測合并為新數據集中的一條觀測。它主要分為一對一合并和匹配合并。
一對一合并指把一個數據集中的第k條觀測同另一個數據集中的第k條觀測合并。新生成的數據集中的觀測總數為這些數據集中觀測個數的最大值。如果相應的某個數據集已沒有觀測,則相應的變量值為默認值。若在幾個數據集中有共同的變量,則SAS默認使用最后出現的數據集中的變量值。
匹配合并與一對一合并最主要的區別在于它按照相同的關鍵變量合并。合并前必須把每個數據集根據關鍵變量排序。
例1-5 若已存在數據集chap1.C和數據集chap1.D(內容如表1-5和表1-8所示),將它們按照關鍵變量name橫向連接成數據集chap1.CD。
表1-8 數據集chap1.D

編寫如下程序(其存儲在光盤中的路徑為“proc\chap1\merge”):
proc sort data=chap1.C out=chap1.C; by name; run; proc sort data=chap1.D out=chap1.D; by name; run; /*以上對數據集chap1.C和chap1.D按照關鍵變量name升序排列*/ data chap1.CD; merge chap1.C chap1.D; /*橫向合并數據集chap1.C和chap1.D*/ by name; /*設置關鍵變量為id*/ run;
選擇Run|Submit命令提交程序,則新建數據集chap1.CD如表1-9所示。
表1-9 數據集chap1.CD

1.3.6 數據集轉置
數據集的轉置即把SAS數據集的行列互換。可應用SAS的TRANSPOSE過程完成此功能,該過程一般使用如下格式:
PROC TRANSPOSE<<DATA=輸入數據集 OUT=轉置數據集><選項列表>; VAR 變量列表; ID 變量; COPY 變量列表; RUN;
TRANSPOSE過程從讀取的數據集中創建主要包含以下三類變量的新數據集:
● 由原數據集中的觀測轉置后創建的新變量,即轉置變量,如_NEME_、COL1、COL2、COL3…COLn。
說明:用戶可自設轉置變量名的方法有:
(1)通過PROC TRANSPOSE語句的選項OLDNAME=NEWNAME將原數據集中的變量名改為新變量NEWNAME。
(2)通過選項prefix=NO,修改默認的新變量名COL1、COL2、COL3為NO1、NO2、NO3。
(3)用 ID 命令定義原數據集中某一變量的對應取值來代替新變量名稱 COL1、COL2、COL3。
● 從原數據集中復制過來的變量,使用COPY語句定義這個變量,COPY的變量與原數據集中的變量有相同的變量名和值。
● 為識別新數據集中每條觀測的來源,用ID語句定義的新變量。
例1-6 已知數據集chap1.A(內容如表1-3所示,其存儲在光盤中的路徑為“data\chap1\A”),將其轉置為新數據集chap1.TA,并且將原數據集中的變量name變為course、列變量改為學生姓名。
編寫如下程序(其存儲在光盤中的路徑為“proc\chap1\example1_6”):
proc transpose data=chap1.A out=chap1.TA name=course; /*將數據集chap1.A轉置為新數據集chap1.TA,變量名name改為course*/ var statistics chinese; /*指定轉置變量*/ id name; run;
選擇Run|Submit命令提交程序,新建轉置后的數據集chap1.TA如表1-10所示。
表1-10 數據集chap1.TA

1.3.7 數據集的導入與導出
SAS系統的Import Wizard和Export Wizard提供了便捷的菜單操作方式實現數據集的導入與導出。以下通過例1-7詳述使用方法。
例1-7 已知SPSS數據文件height.sav(其在光盤中的存儲路徑為chap1/data/height.sav)。
(1)將其導入SAS系統,存儲成數據集chap1.example1_7。
(2)將數據集chap1.example1_7導出成Excel表格height.xls。
問題(1)的操作過程如下。
步驟一:選擇菜單File|Import,彈出如圖1-9所示對話框,Standard data source(標準數據)選項下的Select a data source from the list列出了能通過Import Wizard過程導入SAS系統的標準數據格式,本例中選擇SPSS File(*.sav),單擊Next按鈕進入如圖1-10所示界面。

圖1-9 導入數據——選擇數據類型

圖1-10 導入數據——指定數據文件
步驟二:在Where is the file(文件路徑)欄中輸入需要導入文件在PC上的存儲路徑,或者單擊Browse(瀏覽)按鈕在彈出的對話框中選擇指定文件,單擊Next按鈕,進入圖1-11所示界面。
步驟三:在Choose the SAS destination(定義存儲的SAS數據集)下的Library(邏輯庫)下拉列表中指定存儲的邏輯庫名 CHAP1,在 Member(對象)下拉列表中指定存儲的數據集EXAMPLE1_7(注意,SAS 數據集名不區分大小寫,因此 CHAP1.EXAMPLE1_7與chap1.example1_7指向同一個文件)。此時可以直接單擊Finish(完成)按鈕實現數據集導入。

圖1-11 導入數據——確定數據集名
注意:若單擊圖1-11所示對話框上的Next 按鈕,在彈出的對話框中指定完成數據導入的SAS 數據集的程序名及存儲位置,此后可直接打開該程序(如以上操作的SAS 程序如圖1-12所示),更改SAS數據集名和原始數據位置即可快捷實現數據導入。此操作適用于需導入多個同一類別的數據文件。

圖1-12 導入數據——SAS程序
問題(2)的操作過程如下。
步驟一:選擇菜單File|Export,彈出如圖1-13所示對話框,在Library(邏輯庫)下拉列表中選擇CHAP1,在Member(對象)下拉列表中選擇數據集EXAMPLE1_7,單擊Next按鈕彈出如圖1-14所示對話框。

圖1-13 導出數據——選擇數據集

圖1-14 導出數據——選擇數據類型
步驟二:在此選擇導出數據格式Microsoft Excel 5 or 95 Workbook(*.xls)(EXCEL工作簿),單擊Next按鈕進入圖1-15所示對話框。

圖1-15 導出數據——確定存儲路徑
步驟三:確定導出文件存儲路徑和文件名“E:\data\chap1\height.xls”,單擊 Finish(完成)按鈕完成數據導出。
注意:與導入文件類似,導出過程可保存完成操作過程的SAS程序,更改相應部分實現數據的快速導出。
- 現代企業應用設計指南
- IBM Cognos 8 Report Studio Cookbook
- OpenStack實戰指南
- Celtx: Open Source Screenwriting Beginner's Guide
- Wordpress 3 Complete
- Spring Web Flow 2 Web Development
- BIRT 2.6 Data Analysis and Reporting
- NetLogo多主體建模入門
- Photoshop CC UI設計標準培訓教程
- Photoshop CS6 圖像處理項目任務教程
- Designing and Implementing Linux Firewalls and QoS using netfilter, iproute2, NAT and l7/filter
- Moldflow 2021模流分析從入門到精通(升級版)
- 剪映+Vlog+Premiere短視頻制作從新手到高手
- iOS智能手機APP界面設計實戰教程
- 會聲會影X8 DV影片制作/編輯/刻盤實戰從入門到精通