第二章 導入數據到SAS | 格式規範數據讀取


2.1 導入數據的方法

將數據導入SAS的方法有不少,但能夠概括爲四個基本類別,其中方法二、3是須要掌握的重點。編輯器

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


2.2 利用導入嚮導讀入

導入嚮導默認數據第一行做爲變量名稱,並會自動掃描文件來決定變量的類型ide

使用導入嚮導導數通常分如下幾個步驟:工具

  • 啓動:文件 → 導入數據
  • 選擇導入文件類型
  • 選擇導入文件
  • 選定分隔符:左擊options選擇,csv和製表符(Tab)分隔文件SAS會自動識別
  • 指定邏輯庫和數據集名稱
  • fish結束


2.3 格式規範數據讀取

2.3.1 指定原始數據位置(infile)

根據原始數據存儲的不一樣位置,能夠分爲內部原始數據、外部原始數據。用infile語句來指定元數數據位置。學習

內部原始數據ui

若是在SAS程序中輸入數據,則這些數據被稱爲內部原始數據,使用「datalines語句」代表它。需注意的是,datalines語句必須是data步最後一條語句,其後的全部行都將被視爲數據行,直到遇到一個分號(;)爲止。unix

*將內部原始數據讀入到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';

長記錄code

當從外部數據文件讀入數據時,務必記得「檢查日誌」,由於一些很是有價值的信息,會在日誌中體現,如觀測數、變量數、記錄最大/最小長度。

若外部文件中記錄長度超過了256個字符,且SAS沒有讀取到全部數據,這時能夠在infile語句中使用lrecl=選項,指定一個至少和數據文件中最長記錄等長的長度。

*從外部原始數據讀入數據到SAS數據集;
data work.testdata;
    infile infile 'D:\code\test.dat' lrecl = 300;   /* 指定記錄長度最大爲300個字符 */
    input president $ party $ number;
run;


2.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;


2.3.3 讀取按列排列原始數據(列輸入)

列輸入和列表輸入相似,但適用範圍更廣,具備如下幾點優點:

  • 值之間無須空格
  • 缺失值能夠留空
  • 字符型數據能夠內嵌空格
  • 能夠跳過不須要的變量

一般調查數據、帶有街道地址的數據集,可採用列輸入讀取。

INPUT語句

列輸入也是經過input語句實現數據讀入,語法規則和列表輸入相似,區別在於變量以後須要列出該變量對應的列或者列範圍,用這些列表示數值或者字符在數據行中的位置。

示例:input Name ¥ 1-10 Age 11-13 Height 14-18;


2.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 經常使用輸入格式。


2.3.5 混合的輸入樣式(列表輸入+列輸入+格式輸入)

前面學習了三種主要的輸入樣式:

  • 列表輸入:最簡單
  • 列輸入:稍微難一點
  • 格式化輸入:最複雜

由於SAS中數據格式多種多樣,沒有一種輸入樣式能知足絕大多數需求。所,更多時候咱們採用混合的樣式輸入。

示例:input parkname $ 1-22 state $ year @40 acreage comma9. ;

上面的示例就採用了多種樣式的組合:

  • parkname ($ 1-22):列輸入
  • state($):列表輸入
  • year:列表輸入
  • acreage (comma9):格式化輸入

此外,還用了列指針,語法@n,n指SAS要移動到的列,經常使用來在一行數據裏向前或者向後移動,以調整數據讀取起始位置,應用場景有:

  • 跳過不須要的數據
  • 使用不一樣的輸入格式兩次讀取同一個變量
相關文章
相關標籤/搜索