Leo Yeh's Blog

SAS 快速入門 (6)

教學目標

撰寫 SAS 程式快速入門之如何透過選項控制檔案資料的輸入,適合對象為沒有學過 SAS 程式,但想學 SAS 程式的使用者。

重點概念

上一篇我們主要介紹如何將我們的資料放入 SAS 資料集中,然而這篇則主要介紹如何透過選項控制檔案資料的輸入。當我們需要讀取原始資料時,基本上 SAS 會先做了某些假設情況,像是從第一行開始讀取資料,針對跨行的觀測值,主要會自動轉至下一行繼續讀取資料。然而實務應用時通常會遇到不符合上述預設的資料時,此時我們就能夠在 INFILE 敘述中的選項控制輸入。

告訴 SAS 該從哪一行開始讀取資料

在實務應用中我們會遇到資料開將會有些說明欄位的資訊,此時就能夠設定 FIRSTOBS 選項告訴 SAS 該從哪一行開始讀取資料,請參考下述 SAS 程式。

CUSTOMER.TXT 檔案內容

1
2
3
4
5
6
Name Gender Age City
Alice F 16 Taipei
Bob M 27 Keelung
Candy F 18 Taichung
David M 24 Kaohsiung
Emma F 26 Tainan

FIRSTOBS 範例

1
2
3
4
DATA customer;
INFILE 'C:\DATA\CUSTOMER.txt' FIRSTOBS=2;
INPUT Name $ Gender $ Age City $;
RUN;

輸出結果

Obs Name Gender Age City
1 Alice F 16 Taipei
2 Bob M 27 Keelung
3 Candy F 18 Taichung
4 David M 24 Kaohsiung
5 Emma F 26 Tainan

上述 FIRSTOBS 範例程式主要是告訴 SAS 略過第一行欄位資訊,該從第二行開始讀取資料,因此不會因為讀取欄位資料導致程式錯誤。

告訴 SAS 該讀取資料至哪一行結束

在實務應用中我們會遇到僅需讀取至哪一行的資料為止,此時就能夠設定 OBS 選項告訴 SAS 該讀取資料哪一行結束,請參考下述 SAS 程式。

CUSTOMER.TXT 檔案內容

1
2
3
4
5
6
Name Gender Age City
Alice F 16 Taipei
Bob M 27 Keelung
Candy F 18 Taichung
David M 24 Kaohsiung
Emma F 26 Tainan

OBS 範例

1
2
3
4
DATA customer;
INFILE 'C:\DATA\CUSTOMER.txt' FIRSTOBS=2 OBS=5;
INPUT Name $ Gender $ Age City $;
RUN;

輸出結果

Obs Name Gender Age City
1 Alice F 16 Taipei
2 Bob M 27 Keelung
3 Candy F 18 Taichung
4 David M 24 Kaohsiung

上述 OBS 範例程式主要是告訴 SAS 略過第一行欄位資訊,該從第二行開始讀取資料,同時僅讀取至第五行結束,因此不會讀取 Emma 的資料。

告訴 SAS 自動補上遺漏值

在實務應用中我們常會遇到資料收集不齊全的情況,此時就能夠設定 MISSOVER 選項告訴 SAS 自動補上遺漏值,請參考下述 SAS 程式。

CUSTOMER.TXT 檔案內容

1
2
3
4
5
6
Name Gender Age City
Alice F 16 Taipei
Bob M 27
Candy F 18
David M 24 Kaohsiung
Emma F

MISSOVER 範例

1
2
3
4
DATA customer;
INFILE 'C:\DATA\CUSTOMER.txt' FIRSTOBS=2 OBS=5 MISSOVER;
INPUT Name $ Gender $ Age City $;
RUN;

輸出結果

Obs Name Gender Age City
1 Alice F 16 Taipei
2 Bob M 27 .
3 Candy F 18 .
4 David M 24 Kaohsiung

上述 MISSOVER 範例程式主要是告訴 SAS 略過第一行欄位資訊,該從第二行開始讀取資料,同時僅讀取至第五行結束,因此不會讀取 Emma 的資料,此外 SAS 在每一行觀測值中讀取變數時,若一行若讀完,則會進入下一行直到輸入的變數都讀取了。但是因為 MISSOVER 的選項,所以 SAS 將不會至下一行讀取變數,此時未讀取值的變數將會成為遺失值。此外 SAS 預設的選項是 FLOWOVER ,至於相關的選項則還有 TRUNCOVER 、 STOPOVER 和 SCANOVER。

告訴 SAS 該讀取以分隔符號為主的資料

有些原始資料中的變數彼此之間會用空格分隔,但還是會有情況是透過其它分隔符號進行分隔,像是 CSV 檔案格式,此時我們就能夠透過 DLM 和 DSD 選項,首先 DLM 選項的全名為 Delimiter,主要是用來指定分隔符號,而 DSD 選項的全名為 Delimiter Sensitive Data ,主要會將兩個相鄰的分隔符號當成缺失值處理,並且 DSD 預設的分隔符號為逗號,或者透過 DLM 指定分隔符號。

CUSTOMER.TXT 檔案內容

1
2
3
4
5
6
Name,Gender,Age,City
Alice,F,16,
Bob,M,27,Keelung
Candy,F,,Taichung
David,M,24,Kaohsiung
Emma,F,,Tainan

DLM 範例

1
2
3
4
DATA customer;
INFILE 'C:\DATA\CUSTOMER.txt' FIRSTOBS=2 DLM=',' DSD MISSOVER;
INPUT Name $ Gender $ Age City $;
RUN;

輸出結果

Obs Name Gender Age City
1 Alice F 16 .
2 Bob M 27 Keelung
3 Candy F . Taichung
4 David M 24 Kaohsiung
5 Emma F 24 Tainan

總結當我們透過 INFILE 讀取原始資料時,能夠在 INFILE 敘述中的選項控制輸入,分別告訴 SAS 該從哪一行開始讀取資料,該讀取資料至哪一行結束,自動補上遺漏值,以及讀取以分隔符號為主的資料。

相關資源

⬅️ Go back