Proc Format

Cách thức sử dụng Proc Format

Mục lục

Trong bài Cú pháp IF - THEN và Loop đã giới thiệu về sử dụng if-then để chia khoảng các biến:

DATA NEW;
	SET SASHELP.CARS;
	LENGTH COMMENT $20. ;
	IF MSRP<=30000 THEN COMMENT="Cheap";
	ELSE IF MSRP<=40000 THEN COMMENT="Medium";
	ELSE COMMENT="Expensive";
RUN;

Với các biến có nhiều khoảng chia thì cú pháp IF-THEN rất dài. Ta có thể dùng PROC FORMAT để rút gọn câu lệnh IF-THEN

Proc Format

PROC FORMAT dùng để định dạng dữ liệu một cách nhanh chóng và trực quan (thay thế cho IF-THEN). Cú pháp tổng quát của PROC FORMAT như sau:

PROC FORMAT;
  VALUE FORMAT_NAME
  VALUE_OR_RANGE1='LABEL_VALUE1'
  VALUE_OR_RANGE2='LABEL_VALUE2';
RUN;

Để sử dụng format, dùng lệnh put (cho biến chữ) và input (cho biến số):

DATA NEW_DATA;
  SET OLD_DATA;
  NEW_VAR=PUT(OLD_VAR, FORMAT_NAME.);
RUN;

Chú ý:

  • FORMAT_NAME cho biến chữ phải bắt đầu bằng $.
  • FORMAT_NAME không được kết thúc bởi số.
  • Biến chữ mới được tạo bằng PROC FORMAT thì không cần khai báo độ dài.

Proc Format cho biến chữ

Cách sử dụng PROC FORMAT cho biến chữ được minh hoạ như sau:

PROC FORMAT;
  VALUE $VNESE
  'USA'='Hoa Ky'
  'Europe'='Chau Au'
  'Asia'='Chau A';
RUN;

DATA TEMP01;
  SET SASHELP.CARS;
  TRANSLATE=PUT(ORIGIN, $VNESE.);
RUN;

PROC FORMAT có thể được áp dụng linh hoạt theo nhiều cách khác:

PROC FORMAT;
  VALUE $EXAMPLE_A
  'Asia'='Chau A'
  'USA', 'Europe'='Khong phai Chau A';
RUN;

PROC FORMAT;
  VALUE $EXAMPLE_B
  'Europe'='Chau Au'
  OTHER='Khong phai chau Au';
RUN;

DATA TEMP02;
  SET SASHELP.CARS (KEEP=ORIGIN);
  TRANSLATE1=PUT(ORIGIN, $EXAMPLE_A.);
  TRANSLATE2=PUT(ORIGIN, $EXAMPLE_B.);
RUN;

Proc Format cho biến số

Chú ý khi tạo format cho biến số:

  • Cần tránh khoảng trống giữa các khoảng giá trị (đảm bảo tính liên tục). Ví dụ:

    • Dùng \((2;3),(3,4)\) sẽ thiếu giá trị 3.
      • Dùng \([2;3],[3,4]\) vì sẽ overlap giá trị 3.
      • Dùng \([1;3],[4,6]\) sẽ thiếu các giá trị như \(3.6,3.7,…\).
  • Cần bao hàm được tất cả khoảng giá trị (dùng LOW và HIGH).

Các viết các khoảng trong PROC FORMAT như sau:

  • \(A<-B\) tương đương với \((A;B]\).
  • \(A-B\) tương đương với \([A;B]\).
  • \(A-<B\) tương đương với \([A;B]\).
  • \(LOW-A\) tương đương với \((-\infty; A]\)
  • \(A-HIGH\) tương đương với \([A;+\infty)\).

Ví dụ dùng PROC FORMAT để định nghĩa khoảng:

PROC FORMAT;
  VALUE RANGE
  LOW-<30000='CHEAP'
  30000-<40000='MEDIUM'
  40000-HIGH='EXPENSIVE';
RUN;

DATA TEMP03;
  SET SASHELP.CARS (KEEP=MSRP);
  PRICE_RANGE=PUT(MSRP, RANGE.);
RUN;

Chú ý rằng, các giá trị 'CHEAP', 'MEDIUM', 'EXPENSIVE' không phản ánh đúng thứ tự của các nửa khoảng (nghĩa là các biến categorical sẽ được sắp xếp theo thứ tự A-Z). Để đảm bảo tính thứ tự của khoảng, khuyến nghị được đưa ra như sau:

PROC FORMAT;
  VALUE RANGE
  LOW-<30000='[1] CHEAP'
  30000-<40000='[2] MEDIUM'
  40000-HIGH='[3] EXPENSIVE';
RUN;

Proc format to/from dataset

To dataset

Format của biến sau khi được định nghĩa bằng proc format có thể được chuyển thành dataset thông qua cú pháp như sau:

PROC FORMAT  LIBRARY=WORK CNTLOUT=TEMP_FTMOUT ;
RUN;

Code SAS phía trên sẽ output tất cả các format được lưu trong work sang dataset TEMP_FTMOUT. Ví dụ với cú pháp của Proc Format là:

PROC FORMAT;
	/* X */
	VALUE FMT_X 
		.,LOW - 0 = '[01] X <= 0' 
		0< - 8 = '[02] 0 < X <= 8' 
		8< - 13 = '[03] 8 < X <= 13' 
		13< - 23 = '[04] 13 < X <= 23' 
		23< - 43 = '[05] 23 < X <= 43' 
		43< - 106 = '[06] 43 < X <= 106' 
		106< - HIGH = '[07] 106 < X';
RUN;

Thì cấu trúc của bảng output tương ứng là:

FMTNAME START END LABEL TYPE SEXCL EEXCL HLO
FMT_X . . [01] X <= 0 N N N  
FMT_X LOW 0 [01] X <= 0 N N N L
FMT_X 0 8 [02] 0 < X <= 8 N Y N  
FMT_X 8 13 [03] 8 < X <= 13 N Y N  
FMT_X 13 23 [04] 13 < X <= 23 N Y N  
FMT_X 23 43 [05] 23 < X <= 43 N Y N  
FMT_X 43 106 [06] 43 < X <= 106 N Y N  
FMT_X 106 HIGH [07] 106 < X N Y N H

Từ cú pháp của proc format, ta có thể hiểu được:

  • FMTNAME là tên của format.
  • START là giá trị bắt đầu của khoảng chia.
  • END là giá trị kết thúc của khoảng chia.
  • LABEL là nhãn được gán cho khoảng chia.
  • TYPE là định dạng của biến với N (numeric) là biến số, C (character) là biến chữ.
  • SEXCL(Start Exclude), EEXCL(End Exclude): Có bao gồm giá trị bắt đầu và giá trị kết thúc hay không (Y là có và N là không). Ví dụ SEXCL=N và EEXCL=Y nghĩa là \((START, END]\).
  • HLO (high, low, other) với L nghĩa là khoảng chia có giá trị LOW (\(-\infty\)), H nghĩa là khoảng chia có giá trị HIGH (\(\infty\)) và O nghĩa là Other.

From dataset

Format của biến có thể được tạo từ dataset thay cho việc viết proc format. Trước hết, ta cần chuẩn bị data có dạng tương tự như data TEMP_FTMOUT ở mục trên. Để chuyển từ Dataset thành Format, ta dùng cú pháp:

PROC FORMAT CNTLIN=TEMP_FTMOUT;
RUN;

Overview
Data Step
Data Aggregation
Data Visualization
Proc SQL
Variable Analysis
Macro
Model Regression
Variable Selection
Model Assessment