【09】眼見不為憑 – 格式SAS Format

格式SAS Format

資料值顯示的模樣

客製化輸入到輸出特殊格式,包含文字數值日期自定義格式


格式SAS Format

格式是我們在SAS上所看見的資訊,它可能與原本的資料值有很大的不同或是很類似

它可以用來讀取特殊形式的資料,也可以用來輸出特殊形式的訊息

舉例來說:有1個值是23637,它可以透過格式顯示成$23,637,也可以顯示成00023637

取決於它原本資料所代表的意義與我們想賦予的訊息

SAS看到的是原本的資料值、我們看到的是格式化後的資訊

所以更改格式,只會影響到我們看見的資訊,並不會修改SAS對這個值的認知


內建格式

SAS有許多的內建格式,依照屬性可以分為文字、數值還有日期這三類格式

格式的組成為 <$>format<w>.<d>

  • $:當要為文字變數套用格式時,需在最前面使用這個符號
  • format:用來放入想要套用的SAS format
  • w:表示這個格式的寬度
  • .:表示與.相連的前後為一個完整的格式名稱
  • d:表示數值變數中浮點數的小數位寬度
data _null_;
	char="ABCDEFGHIJK";
		put char= $3.;
		
	num=12345.6789;
		put num= 12.2;
		
	date=23456;
		put date= date9.;
run;

下面的char、num、date分別為套用文字、數值、日期格式後的不同值

文字格式

套用在文字變數上的文字格式,在套用格式時,格式名稱必須以$為開頭

常用格式範例(value=ABCDEFGH)輸出
$W.$5.ABCDE
$charW.$char5.ABCDE
※$w.與$charW.是等價的

在套用文字格式時,應注意格式會從文字變數左邊的空白開始計算,如果觀察值的左邊是有空白的時候,應該先處理資料(套用Left 函數)

data _null_;
	char1="ABCDEFGHIJK";
		put char1= $5.;
		
	char2="    ABCDEFG";
		put char2= $5.;

	char3="      ABCDE";
		put char3= $5.;
run;

Char1觀察值的左邊沒有任何空白,在套用$5.格式後,會完整的顯示出ABCDE的值

Char2觀察值的左邊有4個空白,在套用$5.格式後,只會顯示出A的值

Char3觀察值的左邊有6個空白,在套用$5.格式後,不會顯示出任何的值


數值格式

套用在數值變數上的數值格式,W的寬度必須包含「.」與「d」的寬度,才不會導致剛好在套用格式後被截斷

常用格式說明範例(value=123456789)輸出
W.d依照小數位顯示數值12.2123456789.00
bestW.d依照小數位由SAS自動選擇最適合的數值格式best12.2123456789
commaW.d以每3位數放置1個逗號顯示數值comma15.2123,456,789.00
zW.d在觀察值前面補0直到W寬度z12.000123456789
※best格式為SAS會自動依照資料值決定最適合的格式
data _null_;
	num=123456789;
		put num= 12.2;
		put num= best12.2;
		put num= comma15.2;
		put num= z12.;
run;

日期時間格式

套用在數值變數上的日期時間格式,與數值格式相同的是同樣套用在數值變數上,但有更廣泛的格式可以使用

在介紹日期時間格式前,不得不再次提到本篇文章中開頭所講的「SAS看到的是原本的資料值、我們看到的是格式化後的資訊

為什麼要特別在日期時間格式拿出來講呢? 因為當你在SAS中看到18Sep2024,SAS看到的卻是23637數值,從格式化後的值完全無法辨別它的真實資料值

因為日期時間格式包含了日期、時間及日期時間格式,所以接下來分別介紹它們的常用格式

日期格式:

常用格式範例(value=23637)輸出
dateW.date9.18SEP2024
yymmddw.yymmdd8.24-09-18
yymmddn.yymmddn8.20240918
YearW.year4.2024
MonthW.month2.9
DayW.day2.18
※yymmddw.與yymmddnw.差別在於後者僅顯示數字,且不能用在informat敘述句上,其他參數請參考YYMMDDx Format

時間格式

常用格式範例(value=83642.894642)輸出
TimeW.dTime.23:14:03
HourW.dHour5.123.2
HHMMW.dHHMM.23:14

日期時間格式:

常用格式範例(value=2042320767.9)輸出
E8601DTW.dE8601DT25.22024-09-18T23:19:27.85

輸入&輸出格式敘述句

在SAS中使用格式的方式為透過輸入格式敘述句(Informat Statement)輸出格式敘述句(Format Statement)

這兩種差別在於Informat敘述句是用來讀取格式化後的資料,會搭配input敘述句使用;而Format敘述句是用來套用與展示格式


Informat Statement

用來讀取格式化後的資料

用法有2種:

1、讀取格式化後的資料

data test;
	informat date yymmdd10.;
	input date;
cards;
2024-01-13
2024-07-08
;
run;
  • 透過Informat敘述句來告訴SAS,接下來要讀取的date變數是以日期格式化後的值,並且要儲存為數值欄位
  • 如果少了Informat敘述句,程式會執行失敗,因為SAS會認為input敘述句裡date宣告的是數值欄位、但讀到「2024-01-13」時卻是文字欄位

2、清除輸入格式

data test1;
	informat date yymmdd10.;
	input date;
cards;
2024-01-13
2024-07-08
;
data test2;
	set test1;
	informat date;
run;
  • 透過Informat敘述句來告訴SAS要清除date的輸入格式
  • 圖片左半邊是test1的date欄位屬性;右半邊是test2的date欄位屬性

Format Statement

用來套用與展示格式

用法有2種:

1、套用格式

data test;
	input date;
	format date date9.;
cards;
23456
23333
24444
;
run;
  • 透過format敘述句來告訴SAS,接下來要讀取的date變數最後要以date9的格式套用

2、清除目前套用格式

data test1;
	input date;
	format date date9.;
cards;
23456
23333
24444
;
data test2;
	set test1;
	format date;
run;
  • 透過format敘述句來告訴SAS要清除date的輸出格式
  • 圖片左半邊是test1的date值(套用date9格式);右半邊是test2的date值(未套用任何格式)

結語

關於SAS內建格式的format與Informat數量非常龐大,有興趣的人可以到官方網站尋找自己想要的格式使用


參考資料:

SAS Formats

SAS Informats

謝謝閱讀這篇文章,有問題歡迎在下方留言

Categories: Basic