山腳下的螞蟻: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則評論

評論文章

您的電子郵件等資訊不會被公開,以下所有項目均必填