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,…\).
- Dùng \((2;3),(3,4)\) sẽ thiếu giá trị 3.
-
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;