目录
-
proc format
proc format 常用于自定义格式。常见以下三种使用方式:
- value
- picture
- format和dataset之间转换
value
语法:
proc format;
value <format-name/$format-name>
'origin-value'='new-value'
;
quit;
示例如下:
proc format library=work;
value $sex
'F'='女'
'M'='男'
;
quit;
data test1;
set sashelp.class;
format sex_new $sex.;
sex_new=sex;
run;
调用后生成的sex_new列并未改变原始值F/M,仅在展示时,显示为女/男。如下:
data test1;
set sashelp.class;
format sex_new $sex.;
sex_new=sex;
sex_new_=sex_new;
run;
Tips: 使用value定义格式时常用规则:
- 字符型:需要使用单引号''。(不可使用双引号"")。
- low:对于数值型变量,使用low来代指变量最小值。
- high: 对于数值型变量,使用high来代指变量最大值。
- low-high:指变量全部取值范围。
- other:代指所列取值以外的范围。
pricture
语法:
proc format:
pricture <format-name>
'origin-value'='new-value'
;
quit;
示例如下:
data format_A;
input id;
datalines;
12345678910
24681024754
25474983754
;
run;
/*将转为000-0000-000电话号码格式*/
proc format;
picture phone_number
low-high='000-0000-0000'
;
run;
/*将$00,000,000,000计数格式,并且显示乘以2*/
proc format;
picture symbol
low-high='00,000,000,000'(prefix='$' mult=2)
;
run;
data test;
set format_A;
format id_1 phone_number. id_2 symbol15. ;
id_1=id;
id_2=id;
run;
与value相同,上述format均不改变原始数据id值,id_1=id,id_2=id。
-
format与dataset之间的相互转换
dataset转换为format
data format;
input id $5. group $8.;
datalines;
1 group1
2 group2
3 group3
4 group4
other
;
run;
data fmt(keep=fmtname start label);
set format;
retain fmtname '$group'; /*group前标注$,表明为字符型*/
rename id=start group=label;
run;
proc format cntlin=fmt;
quit;
cntlin选项用法可见:proc format cntlin=XXX - 简书
format格式转为dataset
proc format;
value $id
'1'='group1'
'2'='group2'
'3'='group3'
'4'='group4'
other=''
;
quit;
proc format
library=work
cntlout=id_output(where=(fmtname='ID'));
quit;
/*'ID'必须为大写,字符型前无需添加$*/
-
format
在SAS DATA步添加一个新变量时,该变量长度会在第一次赋值时定义,后续变量赋值长度超过首次赋值长度时,会自动截断,导致结果显示不全。如下:
data test;
set sashelp.class;
if index(name,'A')>0 then comments='A';
else comments='名字中不含字母A';
run;
上述comments变量首次赋值时,长度为1。else语句中变量赋值长度超过1,导致截断,结果显示为空。
使用length语句,或format语句可避免上述问题。
data test;
set sashelp.class;
format comments $50.;
if index(name,'A')>0 then comments='A';
else comments='名字中不含字母A';
run;