文章概要:作者山腳下的螞蟻結合自身經驗談了程式設計習慣的重要性,然後分別用一些簡單的例子將常用的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則評論