SAS | 格式規范數據讀取


 

1 導入數據的方法

將數據導入SAS的方法有很多,但可以歸納為四個基本類別,其中方法2、3是需要掌握的重點。

  1. 直接將數據輸入SAS數據集
    • 通過VIEWTABLE窗口(打開方式:工具 → 表編輯器),以表格形式導入
    • 通過SAS Enterprise Guide窗,以表格形式導入
  2. 利用原始數據文件創建SAS數據集
    • 通過data步導入
    • 通過導入向導 或 有類似功能的import過程導入
  3. 將其他軟件的數據文件轉換成SAS數據集
    • 通過data步或import過程,把其他類型的數據文件讀成SAS數據集
  4. 直接讀取其他軟件的數據文件

 

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要移動到的列,常用來在一行數據里向前或者向后移動,以調整數據讀取起始位置,應用場景有:

  • 跳過不需要的數據
  • 使用不同的輸入格式兩次讀取同一個變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM