指定输入格式会改变变量的值,指定输出格式不会改变变量的值,只是改变显示的样子。
输出格式通过在DATA步中增加FORMAT语句来定义,一般规定FORMAT语句写在INPUT和CARDS之间,基本形式如下:
FORMAT 变量1 格式1 变量2 格式2…;
主要有三种:
w.d:含义和输入格式一致
commamw.d:将数值整数部分自右向左每三位用逗号隔开。
percentw.d:将数据显示为百分号的形式,它会自动将变量乘以100并加上%。
例1:
/* 数值型变量的输出格式 */
DATA Day03.DEMO1;
INPUT num1 num2 num3;
FORMAT num1 5.2 num2 comma12.1 num3 percent8.2;
CARDS;
50 10205600 0.1234
45 9780000 0.0361
;
RUN;
PROC PRINT;
RUN;
例2:
/* 输入输出格式对值的处理 */
DATA Day03.demo2_2;
INPUT x $ y$2.;
FORMAT x $2.;
x1 = x + 1;
y1 = y + 1;
CARDS;
1100 1100
;
RUN;
PROC PRINT;
RUN;
/* x y x1 y1 */
/* 11 11 1101 12 */
/* 第一步:input */
/* x = '1100' y = '11' */
/* 第二步:format */
/* 输出的x = '11' */
/* 第三步计算 */
/* SAS在计算的时候会做一个隐式的转换会把字符串转换成数字 */
/* x1 = x + 1 = 1100 + 1 = 1101 */
/* y1 = y + 1 = 11 + 1 = 12 */
字符型变量的输出格式与输入格式一致,输出没有8个字节的限制,实际中很少设置字符型变量的输出格式。
日期型变量的输出格式与输入格式基本一致,输出格式可以在宽度前加一个字母,以区分各种显示形式。
| 字母|输出格式|显示示例 |
| -------- | -----: |
|s |yymmdds8.| 18/12/27 |
|d | yymmddd8.| 18-12-27 |
|p |yymmddp8. | 18.12.27 |
|c |yymmddc8. | 18:12:27 |
|b |yymmddb8. | 18 12 27 |
|n |yymmddn8. | 181227 |
例:
/* 时间变量输出格式 */
DATA Day03.demo2;
INPUT date1 :yymmdd10. date2 :yymmdd10. date3 :yymmdd10.;
FORMAT date1 yymmdd10. date2 yymmdds8. date3 yymmddp8.;
CARDS;
18.12.27 181227 20181227
;
RUN;
PROC PRINT;
RUN;
SAS中通过PROC FORMAT来实现自定义格式,例如输入0或1,自动换行为男或女,考试分数输出等第制。
基本形式:
PROC FORMAT;
INVALUE<美元符号> 格式名 变量值或取值范围1=输入格式1 变量值或取值范围2=输入格式2…;
VALUE<美元符号> 格式名 变量值或取值范围1=输出格式1 变量值或取值范围2=输出格式2…;
PICTURE 模板名<数值范围>
INVALUE语句定义输入格式,如果输入格式是字符,则需要加上$.
VALUE语句定义输出格式,如果输出的是字符,则需加上$.
PICTURE语句定义数值的显示模板,类似Excel中的自定义单元格格式。
例:
/* 自定义输入输出格式 */
PROC FORMAT;
INVALUE $ geft 1="男" 2="女";
VALUE scft low-<60="不及格" 60-<80="及格" 80-high="优秀";
PICTURE peft low-high="00.00%";
PICTURE pft low-high="99.00%";
RUN;
DATA Day03.demo3;
INPUT name :$ ge:$geft. sc pe p;
FORMAT sc scft. pe peft. p pft.;
CARDS;
Jack 1 58 18.6 12.32
Rose 2 95 21.1 0.21
Tony 1 75 67.2 11.0
;
RUN;
PROC PRINT;
RUN;
指定程序评估或测试一个或多个条件,以及如果条件被确定为真则执行一个或多个语句,相反如果条件为假则不执行。
1、分支语句基本格式:
IF 表达式 THEN 新变量=;
ELSE 新变量=;
例1:
/* 分支语句if */
DATA Day03.demo4;
INPUT sc;
FORMAT scf $9.;
/* 上面这行解决显示不及格 */
IF sc>60 THEN scf="及格";
ELSE scf="不及格";
CARDS;
90
50
86
56
;
RUN;
PROC PRINT;
RUN;
例2:
/* 使用分支结构 */
DATA Day03.if1;
INPUT sc;
FORMAT scf $9.;
/* IF sc >= 60 THEN scf = '及格'; */
/* ELSE scf = '不及格'; */
IF sc < 60 THEN scf = '不及格';
ELSE IF sc < 70 THEN scf = '及格';
ELSE IF sc < 80 THEN scf = '中等';
ELSE IF sc < 90 THEN scf = '良好';
ELSE scf = '优秀';
CARDS;
60
55
78
89
90
100
;
RUN;
PROC PRINT;
RUN;
语句基本格式:
DO 变量=初始值TO 最终值< 增加值>;
SAS语句;
END;
例:
/* 循环语句 */
DATA Day03.demo5;
/* DO COUNT=1 TO 5; */
/* COUNT + 1; */
RETAIN COUNT 0;/*RETAIN的含义是使变量可以保持最新的值*/
/* COUNT + 1; *count+1称为自操作运算,包含了赋初值,算术运算,以及保持变量最新值的功能;
INPUT sc;
scf = sc * 10;
COUNT = COUNT + 1;
/* OUTPUT;/*代码执行到这将变量输出*/ */
/* END;/*循环最后的END 关键字不要忘记 */
CARDS;
60
54
59
64
89
78
90
67
69
80
;
RUN;
PROC PRINT;
RUN;
其他例1:
求1+2+3+…+10=?
/* 求1+2+3+...+10= */
DATA Day03.demo6;
ETAIN sum 0;*RETAIN的含义是使得变量可以保持最新的值;
INPUT num;
sum = sum +num;
CARDS;
1
2
3
4
5
6
7
8
9
10
;
RUN;
PROC PRINT;
RUN;
其他例2:
求1+2+3+…+100=?
/* 求1+2+3+...+100 */
DATA Day03.demo7;
sum = 0;
DO i = 1 TO 100;
sum = sum + i;
OUTPUT;
END;
RUN;
PROC PRINT;
RUN;
其他例3:
百元鸡问题
/* 百元鸡问题 */
DATA Day03.baiyuanji;
DO hen = 1 TO 20;
DO cock = 1 TO 33;
chicken = 100 - hen - cock;
IF hen * 5 + cock * 3 + chicken / 3 = 100 THEN OUTPUT;
END;
END;
RUN;
PROC PRINT;
RUN;