sas代码与python, matlab有很大的区别,如变量的引用、汉字的解析等等,是完全不同的一种语言。
这里的记录不是教程型,更多的可能算是小tip
/*学习材料是医学统计学专业的课件,但我是数据分析人员,所以这里暂且忽略各种假设检验等*/
/*记录形式大多为代码段+解释*/
【高级编程01】
1. 判断用户指定的文件夹路径是否存在
/*判断用户指定的文件夹路径是否存在*/
%macro ValidationDrath(ProgrameDir=)/secure store des='验证信息-文件路径';
%let RC=%sysfunc(FileExist(%str(&ProgrameDir.)));
%if &RC. NE 1 %then %do;
%put %str(WARING:文件夹路径错误![&ProgrameDir.]不存在);
%abort;
%end;
%else %do;
%put %str(路径正确!);
%end;
%mend;
%ValidationDrath(ProgrameDir=C:\书稿\);
上面的代码段可能一般人不会用到,我也不会用到。不过可以用来学习一下:
1. 宏变量、宏的名称只能是下划线、字母、数字构成
2. 引用宏变量格式:&var. 注意.不能漏
3. 关键字前要加%,如%if等,运行宏也要加%
4. %let是用来赋值的,格式为%let var1=1;
5. %put是将宏变量输出到日志中
6. %str()函数里的汉字不需要用""引起来
2. SQL过程中的into语句
目的:将数据集中的信息(数据)赋值给宏变量
proc sql;
select J2 into: curValue from T2
where compress(J2)="one";
%put &curValue.;
select J2 into: ValueList separated by "," from T2;
%put &ValueList.;
quit;
两个select,效果不同:
curValue中保存的怀疑是一个字符串,而ValueList怀疑还是字符串只不过用逗号隔开了。【应该不是类似list的格式】(如果后续学习确认了是什么类型会改过来的)
日志如下:
3. DATA步Call symput()函数
作用:将数据集中的值赋给宏变量
DATA _NULL_;
x = 100;
CALL SYMPUT('XValue', X); /*将X里的值赋给宏变量XValue*/
RUN;
%PUT &XValue.; /*注意宏变量末尾的.一定不能漏哦*/
4. 局部宏变量与全局宏变量
- 局部宏变量值存活在当前的宏,不同宏之间名称相同的宏变量的参数值是不同的
- 全局宏变量与SAS共存亡,不同宏之间名称相同的宏变量的参数值相同,一个宏里的全局宏变量可以在另一个宏里引用
定义方法:
%MACRO TEST();
%LOCAL Local_i;
%GLOBAL Global_i;
%LET Local_i = 1000;
%LET Global_i = 1000;
%MEND;
%TEST();
%PUT Local_i = &Local_i. Global_i = &Global_i.;
日志输出:
5. 判断变量类型
%SYMEXIST(X); /*判断X是否为宏变量,是返回1,否返回0*/
%SYMGLOBL(X); /*判断X是否为全局宏变量,是返回1,否返回0*/
%SYMLOCAL(X); /*判断X是否为局部宏变量,是返回1,否返回0*/
%DATATYP(&X.); /*判断X的类型,数值型返回NUMERIC,字符型返回CHAR*/
6. 宏结构
%MACRO MacroName()/DES='XXX';
(more sas codes)
%MEND;
- 必须有头有尾
- 位置参数(para1, para2)
- 关键参数(para1=, para2=)
- DES对宏加注释
示例:
/*求1-100, 500-555, 700-1000的总和。要求结果存在全局变量Sum中*/
%MACRO SUM(start=, end=)/DES='求和宏';
%GLOBAL Sum;
%LET Sum=;
%LOCAL i;
%DO i=&start. %TO &end.;
%LET Sum = %EVAL(&Sum. + i);
%END;
%PUT &Sum.;
%MEND;
%SUM(start=100, end=1000);
/*另一种写法,不用全局变量*/
%MACRO SUM(start=, end=)/DES='求和宏';
%LOCAL Sum;
%LOCAL i;
%DO i=&start. %TO &end.;
%LET Sum = %EVAL(&Sum. + i);
%END;
%PUT &Sum.;
%MEND;
7. options系统设置
OPTIONS NOTES=0 SOURCE=0 SOURCE2=0 NODATE NoNumber;
- NOTES=0:屏蔽日志note信息
- SOURCE=0:编辑器提交代码时,屏蔽日志源代码
- SOURCE2=0:%Include提交代码时,屏蔽日志源代码
- NODATE:禁止日志显示系统时间
- NoNumber:禁止输出窗口打印数据集序列号
大规模运算时,显著提高运算速度!!!
LIBNAME CPMacro "G:\统计分析报告程序\CompiledMacro";
OPTIONS MStored SasMSTORE=CPMacro MCOMPILE;
- MStored:允许系统查找编译的宏包
- SasMSTORE=CPMacro:宏包所在的库名CPMacro
- MCOPILE:允许更新宏包
8. 其他
put(mean1, 9.2); /*mean1保留2位小数*/
compress(put(mean1, 0.2) || "+-" || put(stdDev1, 9.2)); /*拼接成字符串*/
keep class N Mean_sd Min Max; /*保留这些变量*/
IF _N_=3 THEN DELETE; /*删除满足条件的行*/
/*---------------------------其他补充工作---------------------------*/
/*删除临时数据集*/
PROC DATASETS NOWARN NOLIST;
DELETE _:;
RUN;
QUIT;
ODS LISTING;
/*是否打印结果*/
%IF %UPCASE(&printYes.)=Y %THEN %DO; /*%UPCASE函数将字符串转成大写*/
PROC PRINT DATA=&outDs. NoObs Label;
RUN;
%END;