PROC FORMAT过程,用于自定义输入和输出格式
自定义格式必须写在date语句前面。
一、基本格式:
PROC FORMAT <options>;
<statements>;
RUN;
二、options:
LIBRARY=libref; 或 LIB=libref;
指定一个路径,用来永久存储自定格式。默认临时存储在Work.Formats中。
libname libref 'c:\sas\formats\lib';
proc format library=libref;
... ;
run;
三、VALUE语句和INVALUE语句:
/*定义输入格式*/
invalue <$> 格式名 变量值或范围1=输入格式1 变量值或范围2=输入格式2……;
/*定义输出格式*/
value <$> 格式名 变量值或范围1=输出格式1 变量值或范围2=输出格式2……;
格式名:
- 长度不能超过32个字符
- 不能是现有的SAS格式(dollarw.d...)
- 不能以数字结束
关于$符号:
- 如果定义输入格式:
输入格式为字符时,需要在“格式名”前加$。 - 如果定义输出格式:
变量值或范围是字符时,需要在“格式名”前加$。 - 总结:输入时,看等号右边;输出时看等号左边。
proc format;
invalue fage
low-<40=30
40-<50=40
50-<60=50
60-high=60;
data creat_format;
input id age fage.;/*在变量age后加上自定义的输入格式fage,别忘了加点号*/
cards;
1 36
2 43
3 51
4 60
5 59
;
proc print;
run;
proc format;
invalue $ grade 1="Freshman" 2="Sophomore" 3="Junior" 4="Senior";
value fscore low-<60="不及格" 60-<80="及格" 80-high="优秀";
data grade;
input id grade :$grade20. score;/*在变量grade后加上自定义的输入格式grade,此时加的$以及20.都是对于输入格式等号右边的考量。*/
format score fscore.;/*指定输出格式所必须的语句*/
cards;
1 1 60
2 4 59
3 3 80
4 2 79
;
proc print;
run;
关于格式定义:
语句格式 | 解释 |
invalue $ gender 1="male" 2="female"; | 创建输入格式gender 当输入1和2时,自动变为male和female。 由于male和female是字符,所以gender前加$。 |
value $ grade "a" - "g"="fair" "o","u"="other" | 创建输出格式grade 当输入值介于a~g之间,输出为fair; o和u输出为other。 由于"a"~ "g"等为字符,因此grade前加$。 |
invalue grade "a"-"g"=1 other=2; | 创建输入格式grade 当输入值介于a~g之间,读取为1; 其他字母读取为2。 由于1、2为数值,因此grade前无须加$。 |
value age low-<40=30 40-<50=40 50-high =50; | 创建输出格式age 当输入值<40时,输出为30; 当输入值≥40且<50时,输出为40; 当>50时,输出为50。 由于low-<40、40-<50、50-high都是数值范围,因此age前无须加$。 |
value score low-59="不及格" other="及格"; | 创建输出格式score 当输入值≤59时,输出为“不及格”; 其余输出为“及格”; 由于low-59等为数值,因此score前不加$。 |
invalue lxfmt 1-4=_same_ 99=.; | 创建输入格式lxfmt 当输入值为1~4时,保持原有值不变; 当输入值为99时,变为“.” 由于1~4和“.”仍然是数值或者缺失值,因此lxfmt前不加$。 |