【SAS学习笔记】高级编程

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;

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值