Mục lục
- Thao tác với biến số (numeric)
- Thao tác với biến chữ (categorical)
- Thao tác với biến ngày tháng (date time)
Thao tác với biến số (numeric)
Các biến mới trong SAS được tạo ra đơn giản bằng cách tính toán thông qua các biến khác.
/*-----NUMBERIC VARIABLES----*/
DATA TEST;
SET SASHELP.CARS (KEEP=Make EngineSize Weight Cylinders Horsepower);
ATTRIB HP_PER_CYLIN FORMAT=PERCENT10.2 LABEL="HP per Cylinders";
HP_PER_CYLIN=Horsepower/Cylinders;
RUN;
Make | Type | Cylinder | Weight | HP_PER_CYLIN |
---|---|---|---|---|
Acura | SUV | 6 | 4451 | 4416.67% |
Acura | Sedan | 4 | 2778 | 5000.00% |
Acura | Sedan | 4 | 3230 | 5000.00% |
Acura | Sedan | 6 | 3575 | 4500.00% |
Acura | Sedan | 6 | 3880 | 3750.00% |
Các hàm thường sử dụng với biến số như sau:
Hàm | Ý nghĩa |
---|---|
SUM(X, Y) | Tổng của \(x\) và \(y\) (coi missing bằng 0) |
+ - * / | Cộng, trừ, nhân, chia |
** | Mũ (ví dụ 2**3 nghĩa là \(2^3\)) |
SQRT(X) | Căn của x (\(\sqrt{x}\)) |
EXP(X) | Mũ cơ số e (\(e^x\)) |
LOG(X) | Logrit cơ số e (\(\ln(x)\)) |
ROUND(X, 0.001) | Làm tròn X đến 3 chữ số sau dấu phảy |
Giá trị missing của biến chữ được hiển thị là dấu chấm (.). Để thao tác với giá trị missing ta làm như sau:
DATA DS_OUTPUT;
SET DS_INPUT;
IF VAR1=. THEN VAR1=0;
RUN;
Thao tác với biến chữ (categorical)
Tạo biến chữ mới
Tương tự với biến số, biến chữ được tạo ra bằng cách tính toán thông qua các biến khác. Tuy nhiên, khi tạo biến chữ cần chú ý độ dài của biến. Ví dụ sau đây trả ra kết quả không như mong muốn:
DATA TEST;
SET SASHELP.CARS (KEEP=Make Model Type Origin DriveTrain Horsepower);
IF Horsepower<165 THEN COMMENT="WEAK";
ELSE IF Horsepower<255 THEN COMMENT="MEDIUM";
ELSE COMMENT="STRONG";
RUN;
Make | Model | Type | Origin | DriveTrain | Horsepower | COMMENT |
---|---|---|---|---|---|---|
Acura | MDX | SUV | Asia | All | 265 | STRO |
Acura | RSX Type S 2dr | Sedan | Asia | Front | 200 | MEDI |
Acura | TSX 4dr | Sedan | Asia | Front | 200 | MEDI |
Acura | TL 4dr | Sedan | Asia | Front | 270 | STRO |
Acura | 3.5 RL 4dr | Sedan | Asia | Front | 225 | MEDI |
Nguyên nhân là do biến COMMENT mới được tạo được phần mềm SAS hiểu nhầm là biến có độ dài bằng 4 (bằng độ dài chữ ‘WEAK’). Do đó với các giá trị dài hơn thì biến COMMENT sẽ không hiển thị đầy đủ. Các làm là xác định độ dài cho biến COMMENT trước như sau:
DATA TEST;
SET SASHELP.CARS (KEEP=Make Model Type Origin DriveTrain Horsepower);
ATTRIB COMMENT FORMAT=$20. LABEL="Comment for Horse power";
IF Horsepower<165 THEN COMMENT="WEAK";
ELSE IF Horsepower<255 THEN COMMENT="MEDIUM";
ELSE COMMENT="STRONG";
RUN;
Make | Model | Type | Origin | DriveTrain | Horsepower | COMMENT |
---|---|---|---|---|---|---|
Acura | MDX | SUV | Asia | All | 265 | STRONG |
Acura | RSX Type S 2dr | Sedan | Asia | Front | 200 | MEDIUM |
Acura | TSX 4dr | Sedan | Asia | Front | 200 | MEDIUM |
Acura | TL 4dr | Sedan | Asia | Front | 270 | STRONG |
Acura | 3.5 RL 4dr | Sedan | Asia | Front | 225 | MEDIUM |
Nối các biến
Để nối các biến, ta có các tuỳ chọn như sau:
- Dùng
||
để nối các biến. - Dùng
CAT
để nối các biến. - Dùng
CATS
- Dùng
CATX
DATA TEST;
SET SASHELP.CARS (KEEP=Make Model Type Origin DriveTrain);
ATTRIB DETAIL FORMAT=$100. LABEL="Detail Information";
DETAIL=CAT(MODEL, " from ", MAKE, " is ", TYPE);
RUN;
Make | Model | Type | Origin | DriveTrain | DETAIL |
---|---|---|---|---|---|
Acura | MDX | SUV | Asia | All | MDX from Acura is SUV |
Acura | RSX Type S 2dr | Sedan | Asia | Front | RSX Type S 2dr from Acura is Sedan |
Acura | TSX 4dr | Sedan | Asia | Front | TSX 4dr from Acura is Sedan |
Acura | TL 4dr | Sedan | Asia | Front | TL 4dr from Acura is Sedan |
Acura | 3.5 RL 4dr | Sedan | Asia | Front | 3.5 RL 4dr from Acura is Sedan |
Substring
Để trích xuất một phần của biến chữ, ta dùng hàm SUBSTR. Cú pháp như sau: SUBSTR(VARIABLE, LOCATION, LENGTH)
. Trong đó:
VARIABLE
là biến cần trích xuất.LOCATION
là vị trí đầu tiên của sẽ trích xuất (từ trái qua phải).LENGTH
là độ dài sẽ trích xuất.
DATA TEST;
LENGTH STRING $20.;
STRING='SAS programming'; OUTPUT;
STRING='Credit risk modeling'; OUTPUT;
RUN;
DATA TEST;
SET TEST;
S1=SUBSTR(STRING, 1, 10);
RUN;
STRING | S1 |
---|---|
SAS programming | SAS progra |
Credit risk modeling | Credit ris |
Để trích xuất 10 ký tự cuối cùng của chuỗi, ta kết hợp với hàm LENGTH
(trả về độ dài của chuỗi).
DATA TEST;
LENGTH STRING $20.;
STRING='SAS programming'; OUTPUT;
STRING='Credit risk modeling'; OUTPUT;
RUN;
DATA TEST;
SET TEST;
S1=SUBSTR(STRING, LENGTH(STRING)-9, 10);
RUN;
STRING | S1 |
---|---|
SAS programming | rogramming |
Credit risk modeling | k modeling |
Một số hàm khác để xử lý biến chữ
Một số hàm thường dùng để xử lý biến chữ như sau:
UPCASE
Viết hoa biến.COMPRESS
Xoá các dấu trắng của biến.
DATA TEST;
LENGTH STRING $20.;
STRING='SAS programming'; OUTPUT;
STRING='Credit risk modeling'; OUTPUT;
RUN;
DATA TEST;
SET TEST;
S1=UPCASE(STRING);
S2=COMPRESS(STRING);
S3="This is "||STRING;
RUN;
STRING | S1 | S2 | S3 |
---|---|---|---|
SAS programming | SAS PROGRAMMING | SASprogramming | This is SAS programming |
Credit risk modeling | CREDIT RISK MODELING | Creditriskmodeling | This is Credit risk modeling |
Thao tác với biến ngày tháng (date time)
Nhập biến ngày tháng
Cách nhập biến ngày tháng trong SAS như sau:
DATA TEST;
FORMAT BIRTH_DATE YYMMDD10.;
BIRTH_DATE='21SEP1994'D; OUTPUT;
BIRTH_DATE='25APR1993'D; OUTPUT;
RUN;
BIRTH_DATE |
---|
1994−09−21 |
1993−04−25 |
Trong một số trường hợp, dữ liệu đầu vào có biến ngày tháng mà được viết dưới dạng text. Khi đó để tính toán chính xác, ta cần chuyển thành dạng ngày tháng.
DATA TEST;
FORMAT ORIGINAL $20.;
ORIGINAL='1994-09-21'; OUTPUT;
ORIGINAL='1993-04-25'; OUTPUT;
RUN;
DATA NEW;
SET TEST;
FORMAT BIRTH_DATE YYMMDD10.;
BIRTH_DATE=INPUT(ORIGINAL, YYMMDD10.);
RUN;
ORIGINAL | BIRTH_DATE |
---|---|
1994−09−21 | 1994−09−21 |
1993−04−25 | 1993−04−25 |
Tính toán với biến ngày tháng:
Để xử lý các biến ngày tháng, ta hay dùng các hàm thông dụng như sau:
YEAR, MONTH, DATE
trả về năm, tháng, ngày của biến ngày tháng.TODAY()
trả về ngày hiện tại.INTNX
Tăng biến ngày tháng lên một khoảng thời gian nhất định.INTCK
trả về khoảng thời gian giữa hai biến ngày tháng.
DATA NEW2;
SET NEW;
FORMAT TODAY YYMMDD10. NEXT_YEAR YYMMDD10.;
YEARMONTH=YEAR(BIRTH_DATE)*100+MONTH(BIRTH_DATE);
TODAY=TODAY();
AGE=INTCK('YEAR', BIRTH_DATE, TODAY);
AGE2=INTCK('DAY', BIRTH_DATE, TODAY)/365.25;
NEXT_YEAR=INTNX('YEAR', TODAY, 1, 'SAME');
RUN;
ORIGINAL | BIRTH_DATE | TODAY | NEXT_YEAR | YEARMONTH | AGE |
---|---|---|---|---|---|
1993−01−08 | 1993−01−08 | 2020-12-09 | 2021-12-09 | 199301 | 27 |
1994−09−21 | 1994−09−21 | 2020-12-09 | 2021-12-09 | 199409 | 26 |
1993−04−25 | 1993−04−25 | 2020-12-09 | 2021-12-09 | 199303 | 27 |