在資料分析時,經常遇到資料格式不是我們預期的,例如日期為文字型態,因此無法計算研究對象的年齡、或與時間有關的所有日期資料,或是資料合併時,發現兩個檔的資料型態不同,以致資料無法合併。以下將簡介SAS中的PUT()與INPUT()等函數的應用。
PUT( )函數的通式:PUT(SOURCE, INFORMAT),可將數值型態的資料轉成文字型態的資料。
INPUT( )函數的通式:INPUT(SOURCE, INFORMAT),可將文字型態的資料轉成數值型態的資料。
函數中的SOURCE指的是變項名稱,INFORMAT指的是想要轉換的資料格式,以下以程式建立一筆資料,共4個變項,n. fee, date, date1,讀入的資料格式如下。
【產生範例資料檔】
data aa;
input n fee $ date $ date1;
cards;
3240.5 3200.2 20150323 20150323
;
proc print;
run;
程式一的示範中,將n 轉成文字型態,寬度為8個字元(byte),若將資料格式轉為comma8.1,表示將資料轉成從右邊數來每3位一個COMMA ','符號的資料格式,若將資料格式轉為dollar8.1,表示將資料轉成從右邊數來每3位一個COMMA ','符號的資料格式,且最前方會出現一個金錢符號'$',但以上3種格式是透過PUT()轉換過來的,會轉成文字格式,且無法計算。
程式一的示範中,將fee 轉成數值型態,寬度為8個字元(byte),若將資料格式轉為comma8.1,表示將資料的轉成從右邊數來每3位一個COMMA ','符號的資料格式,若將資料格式轉為dollar8.1,表示將資料轉成從右邊數來每3位一個COMMA ','符號的資料格式,且最前方會出現一個金錢符號'$',以上3種格式是透過INPUT()轉換過來的,會轉成數值格式,雖然格式不同,但都可計算。
程式一的示範中,將文字型態的date 轉成日期格式,寬度為8個字元(byte),日期格式為數值型態的一種,轉過來後的變項名稱為date_input,SAS儲存的是date_input與1960年1月1日間的天數差,20170天。
程式一的示範中,將數值型態的date1 轉成日期格式,寬度為8個字元(byte),但透過put()函數的轉換,資料會轉成文字型式,日期並非文字型式的資料,因此轉不過去,結果出現一串星號'********',表示沒有對應的轉換內容。
【程式一】
data bb;
set aa;
n_put=put(n,$8.);
n_put1=put(n,comma8.1);
n_put2=put(n,dollar8.1);
fee_input1=input(fee,8.);
fee_input2=input(fee,comma8.1);
fee_input3=input(fee,dollar8.1);
date_input=input(date, yymmdd8.);
date_put=put(date1, yymmdd8.);
format fee_input2 comma8.1
fee_input3 dollar8.1
date_input yymmdd8.;
proc print;
run;
【程式二】
proc contents position data=bb;
run;
利用以上的程式二查看資料的內容,以瞭解資料轉換後的型態。根據下表,轉換後的資料型態只有2種,即8.或$8.,前者為數值型態,後者為文字型態。雖然在INPUT()函數的INFORMAT給定comma8.1、dollar8.1、yymmdd8.,但轉換後並非預期的格式,只是數值型態,此時,需要再以FORMAT指令將格式再作進一步處理,此時才是我們期望的資料格式。
變項名 |
資料型態 |
資料內容 |
程式 |
轉換後 |
||||
變項名 |
資料型態 |
資料內容 |
格式化 |
內容 |
||||
n |
8.1 |
3240.5 |
put(n,$8.) |
n_put |
$8. |
3241 |
|
|
|
|
|
put(n,comma8.1) |
n_put1 |
$8. |
3,240.5 |
|
|
|
|
|
put(n,dollar8.1) |
n_put2 |
$8. |
$3,240.5 |
|
|
fee |
$8. |
3200.2 |
input(fee,8.) |
fee_input1 |
8. |
3200.2 |
|
|
|
|
|
input(fee,comma8.1) |
fee_input2 |
8. |
3200.2 |
comma8.1 |
3,240.5 |
|
|
|
input(fee,dollar8.1) |
fee_input3 |
8. |
3200.2 |
dollar8.1 |
$3,240.5 |
date |
$8. |
20150323 |
input(date,yymmdd8.) |
date_input |
8. |
20170 |
yymmdd8. |
15-03-23 |
|
8. |
20150323 |
put(date1, yymmdd8.) |
date_put |
$8. |
******** |
|
|
留言列表