标签:
/***************************************************格式过程************************************************/
PROC FORMAT <option(s)>;
PROC FORMAT library=libraryPath; *定义的格式的储存位置; VALUE fsmt low-<60=‘C‘ 60-<80=‘B‘ 80-100=‘A‘; *数值格式的转换,fsmt是格式码,小于60分输出c,后面的类似;
value $sexf ‘1‘=‘male‘ ‘2‘=‘female‘; *字符格式的转换;
value color 0,4-9 = ‘other color‘; *离散变量的格式表示方式; PROC PRINT DATA=ep.score; FORMAT t1-t3 fsmt.; *将t1-t3变量按照fsmt的格式输出,也就是见数值转化为相应的字母,格式后面打点才能正确输出,打点是为了区别变量名和格式名; run;
注意:如果有两个区域1-3 3-5 那么3是包括在第一个区域中
/*允许输出逇一行包含几个分类*/
VALUE format-name (MULTILABEL); proc format; value dates (multilabel) ‘01jan2000‘d - ‘31mar2000‘d = ‘1st Quarter‘ ‘01apr2000‘d - ‘30jun2000‘d = ‘2nd Quarter‘ ‘01jul2000‘d - ‘30sep2000‘d = ‘3rd Quarter‘ ‘01oct2000‘d - ‘31dec2000‘d = ‘4th Quarter‘ ‘01jan2000‘d - ‘30jun2000‘d = ‘First Half of Year‘ ‘01jul2000‘d - ‘31dec2000‘d = ‘Second Half of Year‘; run;
PROC FORMAT; PICTURE format-name value-or-range=‘picture‘; RUN;
picture的意思:specifies a template for formatting values of numeric variables,模板是一个单引号内的字符串,最大长度为40
这种格式化有什么优势?
针对于11223344这种数据格式,如果要将其转化为(11)22-33-44,用模板来做,十分简单,value达不到想要的效果
关于这种格式的三种selector
这里举两个例子说明
proc format; picture rainamt 0-2=‘9.99 slight‘ 2<-4=‘9.99 moderate‘ 4<-<10=‘9.99 heavy‘ other=‘999 check value‘; run; data rain; input Amount; datalines; 4 4.00 3.9 3.90 20 020 .5 0.50 6 6.00 ; run;
解释输出结果
所有的输出格式必须与单引号内的输出格式相对应
比如4 对应4.00 后面为什么是0,因为sas规定,如果单引号中‘xxx slight‘,如果x不为0(x不必一样,且x为1-9),那么在值对应不到的位置全部赋为0
如果x为0,那么在对应的位置,值不变,不对应的位置全部赋为空 01 对应 00变为 1
Directives are special characters that you can use in the picture to format date, time, or datetime values 能使得在输出时使用日期格式 标准格式如下 PICTURE format-name value-or-range=‘picture‘ (DATATYPE=SAS-date-value-type); proc format; picture mydate low-high=‘%0d-%b%Y ‘ (datatype=date); /*注意红色字的长度要和输出结果集中的长度一致,否则sas会进行阶段,这里输出占10个格子,所以在写的时候后面就要留两个空格*/ run;
2:管理format
2.1:format过程进行管理 select exclude,选择性的显示需要显示的,logical操作
/*列出你选择的库中的所有格式的具体描述形式,可以选择某些和排除某些*/
PROC FORMAT LIB=library FMTLIB; SELECT format-name; EXCLUDE format-name; RUN;
/*在输出的结果中<在哪边就是不包括哪边*/
2.2:catalog过程管理,可以拷贝,删除,physical&logical操作
PROC CATALOG CATALOG=libref.catalog; CONTENTS <OUT=SAS-data-set>; COPY OUT=libref.catalog <options>; SELECT entry-name.entry-type(s); EXCLUDE entry-name.entry-type(s); DELETE entry-name.entry-type(s); RUN; QUIT;
9968 proc catalog catalog=work.formats; 9969 copy out=renmin.formats; 9970 select Me.format;
select x.formatc; /*字符型后面加c*/ 9971 run; NOTE: 正在将条目“ME.FORMAT”从目录“WORK.FORMATS”复制到目录“RENMIN.FORMATS”。 9972 quit;
3:永久format
PROC DATASETS LIB=SAS-library <NOLIST>; MODIFY SAS-data-set; FORMAT variable(s) format; /*不规定format则为取消当前的format*/ QUIT;
OPTIONS FMTSEARCH= (catalog-1 catalog-2...catalog-n);
注意:如果只写库名,那么sas只会在库中的默认文件夹formats下搜索,库名和文件名都写则会在自己规定的文件夹搜索
如果没包括work.formats和library.formats(一定要全部包含才能改变默认顺序),那么sas还是会先搜索这两个再搜索你自己规定的,想要提前搜索,自己规定的文件就要将这两个写入函数中
PROC FORMAT LIBRARY=libref.catalog CNTLIN=SAS-data-set; libref.catalog is the name of the catalog in which you want to store the format SAS-data-set is the name of the SAS data set that you want to use to create the format.
使用的数据集要用相应的变量才能进行使用,必须有的变量为FmtName Start Label,可选的为end,如果是字符型还需要加上type。变量的种类不能超过这些
PROC FORMAT LIBRARY=libref.catalog CNTLOUT=SAS-data-set; SELECT format-name format-name. . . ; EXCLUDE format-name format-name. . . ; RUN;
proc format lib=library.formats cntlout=sasuser.runs;
data test; input a b @@; cards; 1 1 2 1 2 2 1 3 2 3 2 1 1 2 2 1 1 3 2 3 ; proc tabulate; class a b; table b*a b*a a b; *相乘表示维度联合,单独的表示单个层级; run;
options linesize=200; data test; input a b c @@; cards; 1 1 4 2 1 5 2 2 4 1 3 6 2 3 5 2 1 6 1 2 4 2 1 6 1 3 5 2 3 5 ; proc tabulate; class a b c; table a*b a*c a*(b c) a,b*c; *这里不能用简单的乘法考虑,两个相乘的要考虑成两个层级的概念!!; run;
options linesize=200; data test; input a b c @@; cards; 1 1 4 2 1 5 2 2 4 1 3 6 2 3 5 2 1 6 1 2 4 2 1 6 1 3 5 2 3 5 ; proc tabulate; class a b c; table a all,b*c*f=3.1/rts=5; * *f=3.1单独看为格式的表示方式 all表示一个汇总; run;
标签:
原文地址:http://www.cnblogs.com/yican/p/4054669.html