山脚下的蚂蚁:SAS编程入门

山脚下的蚂蚁:SAS编程入门

    

文章概要:作者山脚下的蚂蚁结合自身经验谈了编程习惯的重要性,然后分别用一些简单的例子将常用的SAS code及对code 的要求进行了介绍

开篇声明:1:以下内容非原创,转自微信公众号山脚下的蚂蚁《2 编程预热——编程要求》,如有侵权,可联系删除

                 2. 以下观点,仅代表作者个人观点,请带着质疑的态度去阅读。如有问题,欢迎评论区留言或直接联系作者 


编程预热——编程要求


在开始讲如何制作图表程序前,我想首先来分享一些行业里约定俗成的要求。经验多的朋友可以略过哈,更多的是给新人看哈。

昨天《开篇之从心出发——统计分析流程发表的匆忙,有点粗糙,有点惭愧。但发表之后,收到很多老同事老朋友的支持,也收到了一些猎头朋友的鼓励。一个猎头朋友告诉我说他看懂了。我很高兴不同背景的朋友能够看懂。如果能帮助到你的职业生涯,那就不胜荣幸了。接下来我也尽量讲“人”话,通俗地跟大家分享。

——————————————————————————

接下来是我通常的语气哈,如果不喜欢勿喷哈,大家提取重点就好啦。

一开始按要求养成好的编程习惯,对自己和别人都是有帮助的。很多人可能会说,我有自己的编程习惯,我不太喜欢受约束。但是你要考虑到别人看到你的程序的感受,比如你的领导、或项目里的Lead programmer审阅你的程序;或者某一天你离职,别人被迫接手你的程序;亦或是将来药品审评中心(CDE)来查阅你的程序。其实,方便别人的同时也是方便自己。一个程序从起草到最后定下来,可能要经历好几次修订,时间可能拖很久,可能久到自己都忘记了。如果养成好的习惯,后期自己修改也轻松。

总之,我想说的是(假装是你老板讲的,不是说假装我是你老板,越抹越黑。。。嗯好吧,你get我的意思就可以),养成好的习惯写程序不是你自己的事,是对你的要求。希望你能严格要求自己,像减肥一样,从什么时间点开始都不晚。(嘿嘿,体重我说来惭愧,但程序我对自己要求是挺严格的。)

另外,需要强调的是,写程序的时候不必要追求高深的、高级的语法,不能仅以正确生成结果为目的。需要侧重逻辑,逻辑清晰最重要,最好写出来得程序也是通俗易懂的。因为你是作者,不是读者。

下边的要求是编程过程中一般需要遵循的,各个公司的要求可能会有些许出入。供大家学习和参考。

以下程序大都是在SAS 软件里编好copy过来的,这里可能格式会变掉。大家多包涵。为了方便大家copy 和 paste, 故没有采用截图。部分程序可以copy到SAS直接运行。

——————————————————————————

例1:


    *Read in data;
    data class;
        set sashelp.class;
        keep name sex age height weight;
    run;
    
    /*Sort data by name*/
    proc sort data=class;
        by name;
    run;


1.data/proc 步以run结尾

2.proc sort 后边跟data=indata,如果观测条数有变化,需要添加out=xxxx

3.程序要缩进(Tab键),data/proc 步之间要加空行

4.注意keep关键变量,减少运行时间,数据清晰简洁

5.变量名/数据集名字不要超过8个字符,要有意义

6.加注释的两种方式*+;或者/*+ */ 后者的快捷键为Ctrl+”/”, 去掉comments的快捷键为Shift+Ctrl+”/”

7.code、变量名、数据集名尽量都用小写,尽量少用下划线打头的变量名和数据集名,如变量名“_age”


2:

    data class1 (rename=(height1=height weight1=weight));

        set class;

        height1=height*2.54;

        weight1=0.45*weight;

        bmi=weight1/(0.01*height1)**2;

        length sex_age $100.;

        sex_age=trim(sex)||"/"||strip(put(age, best.));

        drop height weight;

    run;

    

    /*proc means data=class1 noprint;*/

    /*     var age;*/

    /*     output out=means n=n mean=mean median=median std=sd min=min max=max;*/

    /*run;*/

    

    proc means data=class1 noprint;

        var age height weight;

        output out=means n(age)=n mean(age)=mean  n(height)=n1 mean(height)=mean1  n(weight)=n2 mean(weight)=mean2;

    run;


8.新数据集/新变量名字不能和原来一样,禁止覆盖

9.测试:运行一个语句,查看log,log需要clean(没有error, warning,重复,未初始化,缺失值,转换为等)

程序需要一边做一边调试,保证每一步Log 没有问题,output数据没有问题,一段程序调试好了,再写下一段

10.LOG Clean:Error, Warinig, Repeats, uninstallization, missing value, converted, w.d, truncated,  etc

11.字符型变量长度需提前定义,防止截断

12.注意keep or drop 变量,加速运行速度, 更方便清晰审核数据

13.noprint; 不在输出窗口显示统计量,加快运行速度

14.注释的程序在程序完成后删除


例3

    libname rand "S:\Projects-BE\xxxxx\03_Stat";

    

    proc export data=rand.trt_fast 

        outfile"S:\Projects-BE\xxxxx\Randomization \xxx_随机分配表_餐后.xls" dbms=excel replace label;

      sheet="随机分配表_餐后";

    run;

    

            变为

    

    %let proj= S:\Projects-BE;

    

    proc export data=rand.trt_fast

      outfile"&proj.\xxxxx\Randomization\xxx_随机分配表_餐后.xls" 

      dbms=excel replace label;

      sheet="随机分配表_餐后";

    run;


15.定义绝对路径为宏变量,尽量使用相对路径。

16.文件夹命名不要有空格,可以用下划线或是中划线


例4

    %macro tab(ind=, outd=);

        %macro lis(var1=, id=);

            data ind;

                set &ind.;

                if sex="" then group=1;

                else if sex="" then group=2;

                id=&id.;

                keep &var1 id;

            run;

        %mend lis;

      %lis(var1=xx, id=1);

    

        data &outd.;

            set ind;

        run;

    %mend tab;

    %tab(ind=class, outd=final);

    

17.宏程序以%macro xx开始,以%mend xx结束,注意缩进和对齐


例5

    proc sql noprint;

        select count(distinct pt) into: N1 -: N2 from class group by sex;

    

        create table count as select distinct sex, count(distinct subject) as num from class

        group by sex

        order by sex;

    quit;

    

    %put &N1 &N2;


18.SQL以quit 结尾

    如果不添加quit,可能程序一直显示运行中。


例6

    proc corr data=adpp nosimple fisher;

        by parcat1 parcat2 paramcd;

        var aval ;

        with TOTDOS WGTDOS;

        /* ods trace on; */

        ods output  FisherPearsonCorr=fisher;

    run;

    ods listing;


19.ods trace on;  Log 窗口显示输出模型对应的数据集

     当模型中你不知需输出的数据集名,可以通过添加ods trace on;然后到运行的日志窗口来查看。


其他

20.For TFL,最终的数据集名字命名为final, for ADS,最终的数据集名字命名为ADS的名字,如adsl

    这样以来,方便别人和自己来查看程序。尤其是比较长的程序在进行validation 的时候,这样就不用到程序里找你的final output dataset名字,直接可以去Work Library里查看。


21.英文标点符号后空一格,如if a=b then do; group=1; end; 分号后边有空格。

    Shell一般也是这种规则,比如注释(footnotes)里一句话标点符号后,都是空一格的。文档写作的时候也是。


——————————————————————————


可能不够全面,欢迎各位大拿私信我来补充哈。如果必要,我后期会进一步修订和补充。

如有问题,也欢迎大家私信我留言哈。

如有纰漏,欢迎批评指正哈。


完结



文章来源:2 编程预热——编程要求 (qq.com)

0条评论

评论文章

您的电子邮件等信息不会被公开,以下所有项均必填