文章概要:作者山脚下的蚂蚁结合自身经验谈了编程习惯的重要性,然后分别用一些简单的例子将常用的SAS code及对code 的要求进行了介绍
开篇声明:1:以下内容非原创,转自微信公众号山脚下的蚂蚁《2 编程预热——编程要求》,如有侵权,可联系删除
2. 以下观点,仅代表作者个人观点,请带着质疑的态度去阅读。如有问题,欢迎评论区留言或直接联系作者
编程预热——编程要求
在开始讲如何制作图表程序前,我想首先来分享一些行业里约定俗成的要求。经验多的朋友可以略过哈,更多的是给新人看哈。
昨天《开篇之从心出发——统计分析流程》发表的匆忙,有点粗糙,有点惭愧。但发表之后,收到很多老同事老朋友的支持,也收到了一些猎头朋友的鼓励。一个猎头朋友告诉我说他看懂了。我很高兴不同背景的朋友能够看懂。如果能帮助到你的职业生涯,那就不胜荣幸了。接下来我也尽量讲“人”话,通俗地跟大家分享。
——————————————————————————
接下来是我通常的语气哈,如果不喜欢勿喷哈,大家提取重点就好啦。
一开始按要求养成好的编程习惯,对自己和别人都是有帮助的。很多人可能会说,我有自己的编程习惯,我不太喜欢受约束。但是你要考虑到别人看到你的程序的感受,比如你的领导、或项目里的Lead programmer审阅你的程序;或者某一天你离职,别人被迫接手你的程序;亦或是将来药品审评中心(CDE)来查阅你的程序。其实,方便别人的同时也是方便自己。一个程序从起草到最后定下来,可能要经历好几次修订,时间可能拖很久,可能久到自己都忘记了。如果养成好的习惯,后期自己修改也轻松。
总之,我想说的是(假装是你老板讲的,不是说假装我是你老板,越抹越黑。。。嗯好吧,你get我的意思就可以),养成好的习惯写程序不是你自己的事,是对你的要求。希望你能严格要求自己,像减肥一样,从什么时间点开始都不晚。(嘿嘿,体重我说来惭愧,但程序我对自己要求是挺严格的。)
另外,需要强调的是,写程序的时候不必要追求高深的、高级的语法,不能仅以正确生成结果为目的。需要侧重逻辑,逻辑清晰最重要,最好写出来得程序也是通俗易懂的。因为你是作者,不是读者。
下边的要求是编程过程中一般需要遵循的,各个公司的要求可能会有些许出入。供大家学习和参考。
以下程序大都是在SAS 软件里编好copy过来的,这里可能格式会变掉。大家多包涵。为了方便大家copy 和 paste, 故没有采用截图。部分程序可以copy到SAS直接运行。
——————————————————————————
例1:
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)里一句话标点符号后,都是空一格的。文档写作的时候也是。
——————————————————————————
可能不够全面,欢迎各位大拿私信我来补充哈。如果必要,我后期会进一步修订和补充。
如有问题,也欢迎大家私信我留言哈。
如有纰漏,欢迎批评指正哈。
完结
0条评论