在資料分析時,經常遇到資料格式不是我們預期的,例如日期為文字型態,因此無法計算研究對象的年齡、或與時間有關的所有日期資料,或是資料合併時,發現兩個檔的資料型態不同,以致資料無法合併。以下將簡介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_inputSAS儲存的是date_input196011日間的天數差,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.1dollar8.1yymmdd8.,但轉換後並非預期的格式,只是數值型態,此時,需要再以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.

********

 

 

創作者介紹
創作者 estat 的頭像
estat

以斯帖統計,以專業貼近你的心

estat 發表在 痞客邦 留言(0) 人氣()