1 導入數據的方法
將數據導入SAS的方法有很多,但可以歸納為四個基本類別,其中方法2、3是需要掌握的重點。
- 直接將數據輸入SAS數據集
- 通過VIEWTABLE窗口(打開方式:工具 → 表編輯器),以表格形式導入
- 通過SAS Enterprise Guide窗,以表格形式導入
- 利用原始數據文件創建SAS數據集
- 通過data步導入
- 通過導入向導 或 有類似功能的import過程導入
- 將其他軟件的數據文件轉換成SAS數據集
- 通過data步或import過程,把其他類型的數據文件讀成SAS數據集
- 直接讀取其他軟件的數據文件
2 利用導入向導讀入
導入向導默認數據第一行作為變量名稱,並會自動掃描文件來決定變量的類型。使用導入向導導數一般分以下幾個步驟:
- 啟動:文件 → 導入數據
- 選擇導入文件類型
- 選擇導入文件
- 選定分隔符:左擊options選擇,csv和制表符(Tab)分隔文件SAS會自動識別
- 指定邏輯庫和數據集名稱
- fish結束
3 格式規范數據讀取
3.1 指定原始數據位置(infile)
根據原始數據存儲的不同位置,可以分為內部原始數據、外部原始數據。用infile
語句來指定元數數據位置。
內部原始數據
如果在SAS程序中輸入數據,則這些數據被稱為內部原始數據,使用「datalines語句」表明它。需注意的是,datalines語句必須是data步最后一條語句,其后的所有行都將被視為數據行,直到遇到一個分號(;)為止。
*將內部原始數據讀入到SAS數據集;
data work.testdata;
input president $ party $ number; /* 輸入指定類型的3個變量 */
datalines; /* 數據線 */
Adams F 2
Lincoln R 16
Grant R 18
kennedy D 35
;
run;
外部原始數據
更常見數據是保存在外部文件中,這時數據與程序是分離的,就稱為外部原始數據。需要用「infile語句」告知SAS文件名和路徑,infile語句緊跟在data語句之后,input語句之前,且不同操作環境中路徑表示有差異:
操作環境 | infile語句 |
---|---|
windows | infile 'D:\code\test.dat'; |
unix | infile '/home/rds/test.dat'; |
os | infile 'mydir.test.dat'; |
長記錄
當從外部數據文件讀入數據時,務必記得「檢查日志」,因為一些非常有價值的信息,會在日志中體現,如觀測數、變量數、記錄最大/最小長度。
若外部文件中記錄長度超過了256個字符,且SAS沒有讀取到所有數據,這時可以在infile語句中使用lrecl=
選項,指定一個至少和數據文件中最長記錄等長的長度。
*從外部原始數據讀入數據到SAS數據集;
data work.testdata;
infile infile 'D:\code\test.dat' lrecl = 300; /* 指定記錄長度最大為300個字符 */
input president $ party $ number;
run;
3.2 讀取空格分隔原始數據(列表輸入)
如果原始數據文件中的所有值,都被至少一個空格分隔開,建議使用列表輸入(list input)讀入該原始數據,該方法也被稱為自由格式輸入。
下面是列表輸入的優缺點:
- 優點:簡單好用
- 缺點:
- 只能讀取一條記錄中全部數據,不能跳過不需要的值
- 如果有字符型數據,那它必須沒有內嵌空格,且長度不超過8個字符
- 如果數據文件含日期、其他特殊格式數據,那列表輸入不適用
特別注意,列表輸入也可用於讀取其他分隔符數據文件,如逗號或制表符。並且,可以使用length語句去覆蓋長度不超過8個字符的限制,使字符變量長度變成1 ~ 32767之間任意值。
INPUT語句
列表輸入是通過input語句實現數據讀入,語法規則如下:
- 在input關鍵字后,按照變量名稱出現順序依次列出它們
- 變量名稱符合命名規則
- 若變量為字符類型,則在變量名稱后面加一個$
- 變量名稱之間至少留一個空格
示例:input toadname $ weight jump1 jump2 jump3;
*使用列表輸入,讀取數據文件ToadJump.dat;
data toads;
infile 'D:\code\ToadJump.dat';
input toadname $ weight jump1 jump2 jump3;
run;
proc print data = toads;
title '蟾蜍跳躍比賽';
run;
3.3 讀取按列排列原始數據(列輸入)
列輸入和列表輸入類似,但適用范圍更廣,具有以下幾點優勢:
- 值之間無須空格
- 缺失值可以留空
- 字符型數據可以內嵌空格
- 可以跳過不需要的變量
通常調查數據、帶有街道地址的數據集,可采用列輸入讀取。
INPUT語句
列輸入也是通過input語句實現數據讀入,語法規則和列表輸入類似,區別在於變量之后需要列出該變量對應的列或者列范圍,用這些列表示數值或者字符在數據行中的位置。
示例:input Name ¥ 1-10 Age 11-13 Height 14-18;
3.4 讀取非標准格式的原始數據(格式化輸入)
先明確一個概念「標准格式數據」,只包含數字、小數點、正負符號、科學計數法E。其他的都是非標准格式數據,常見的有:
-
日期
-
嵌入逗號的數字
-
嵌入$符號的數值
輸入格式
輸入格式的三個基本類型是:字符、數值、日期
字符 | 數值 | 日期 |
---|---|---|
$informatw. | informatw.d | informatw. |
$表明這是字符型輸入格式,imformat是該輸入格式的名稱,w是總寬度,d是小數位數(僅限數值型輸入格式),注意,一定不要少些了句點(.)。有兩個輸入格式沒有名稱:
- $w. 用來讀取標准的字符型數據
- w.d 用來讀取標准的數值型數據
格式化輸入
在input語句的變量名稱之后放置輸入格式,稱為格式化輸入。
示例:input name $10. age 3. height 5.1 birthdate mmddyy10. ;
先明確一個概念:為每個變量讀取的列,由起始點和輸入格式的寬度所決定。所以,上面的示例代碼就能解讀為:
- name($10.):字符型數據,默認起始列在第1列,name數據在第1 ~ 10列
- age(3.):數值型數據,起始列在第11列,往后取3列
- height(5.1):數值型數據,起始列在第14列,往后取5列,小數位數為1
- birthdate(mmddyy10.):日期數據,格式為月-日-年,能讀取諸如10-31-2013或10/31/2013格式的日期,起始列在第19列,往后取10列
*讀取非標准格式的原始數據;
data zdata.contest;
infile 'D:\data\sas_file\pumpkin.dat';
input name $16. age 3. +1 type $1. +1 date mmddyy10. /* +1表示跳過一列 */
(score1 score2 score3 score4 score5) (4.1);
run;
有相同輸入格式,把變量和輸入格式分別放到括號中,輸入格式只列出一次 即可。
更多常見的常見輸入格式見page49,第二章 2.8 常用輸入格式。
3.5 混合的輸入樣式(列表輸入+列輸入+格式化輸入)
前面學習了三種主要的輸入樣式:
- 列表輸入:最簡單
- 列輸入:稍微難一點
- 格式化輸入:最復雜
因為SAS中數據格式多種多樣,沒有一種輸入樣式能滿足絕大多數需求。所,更多時候我們采用混合的樣式輸入。
示例:input parkname $ 1-22 state $ year @40 acreage comma9. ;
上面的示例就采用了多種樣式的組合:
- parkname ($ 1-22):列輸入
- state($):列表輸入
- year:列表輸入
- acreage (comma9):格式化輸入
此外,還用了列指針,語法@n,n指SAS要移動到的列,常用來在一行數據里向前或者向后移動,以調整數據讀取起始位置,應用場景有:
- 跳過不需要的數據
- 使用不同的輸入格式兩次讀取同一個變量