2014年4月25日 星期五

SAS 資料處理技巧1

變項Keep 與 Drop
  • data work (drop=age group);
  • set clinic    (keep=age group BMI );
    • 讀檔時 (SET) 只進 age group BMI ,新資檔(DATA) 刪除 age group,最後輸出只有BMI


FIRST.變項 與 LAST.變項
  • 一定要先Proc Sort
  • Proc Sort 之後,遇到 Data ; by X Y;,在program data vector裡會自動建立FIRST.變項 與 LAST.變項,First.X Last.X First.Y Last.Y,可參考下表
Department FIRST.Department LAST.Department
A 1 0
A 0 0
A 0 1
B 1 0
B 0 1
C 1 1

範例如下:
data salaries2 ; set salaries ;
by Department;
/*第一筆設定為0*/ 
if first.Department then Payroll=0;
/*累加*/
      payroll+yearly;
/*是最後一筆再輸出*/
if last.Department;
run;

Using Direct Access:指定讀特定一筆數據,並輸出。(Point-Output-Stop)
  • Point 與 OUTPUT 聯用。通常用於取得Random sample。
    • data test;
          obsnum=3; /*自定變項與值*/
          set salaries  point=obsnum;  /* 被 point 變項就消失 */
          N=1;
          OUTPUT;  /*強制輸出到實體資料檔*/
          Stop;     /*找到某筆數據後,停止 iteration,不
                          必等到 Mark of the end */
      K=1;   /*因為在OUTPUT之後,數值不會被輸出*/
      run;

資料列末端的技巧 ( End=var )
  • 用途:輸出資料檔的最未一筆總計。(似乎用Last.即可)
  • End=var,建立暫時變項 var ,若 SET statemnet 讀到了 end of file,var就為1
  • END= 不與 POINT= 一起用
    • set sasuser.stress2(keep=timemin timesec) end=last;
    • .........
    • if last; /* 當 last = 1 才輸出 */

SAS DATA SET 的處理流程,與讀 Raw data file 差不多,主要差異如下:
  • Execution Phase:第一筆資料輸出到新資料檔後,會在 Program Data Vector裡 Retain 保留 SET statement 已讀入的 (如:第一筆資料) 與 sum statement 所產生的變項,一直到再執行 SET statement,讀入第二筆數據
    • 但讀 RAW DATA FILE 則是重設為 MISSING,除非是RETAIN, SUM STATEMENT變項, 暫時的ARRARY,FILE或INFILE的OPTION建立的變項,自動變項

2014年4月24日 星期四

建構變項

累積加總
  • data stress; set sasuser.stress2;
    TotalTime=(timemin*60)+timesec;
    SumSec+totaltime;
    run;
    • SumSec 在 + 的左邊,它的起啟值就是 0 ,而非 missing
    • 其結果類似以下右欄
      1  1
      1  2
      1  3
      1  4

RETAIN variable <initial;-value>;
  • 主要特色
    • data complie 的指令,無法作用於 set, merge的變項
    • 指定變項初始值為任何文字或數字,避免變項在每次iteration被重置
  • SumSec 由10000 起算而非 0
    retain SumSec 10000;
    sumsec+totaltime;

IF-THEN/ELSE 的指令,會比 很多的 IF-THEN 更省資源,或者改用 SELECT-WHEN 的語法
  • SELECT (select-expression);
    WHEN ( condition,…, condition ) Execute-statement;
    WHEN ( condition,…, condition ) Execute-statement;
    OTHERWISE <Execute-statement>;
    END;
    • select (TimeMin) ;
          when ( '13' ) TimeGroup='Lower';
      雖然TimeMine是數值,也一定要 “”
    • OTHERWISE  一要有,否則有
      ERROR: Unsatisfied WHEN clause


變項特性的設定
  • The length of a new variable is determined by the first reference in the DATA step。若要用LENGTH 來指定變項長度,應放在最前端的程式。
    • length Test $ 10;
  • LABEL var= ‘Description’;
  • FORMAT var formats;

DROP and KEEP 變項
  • 用在 Data 、set 、Proc data= 的 Option
    • (DROP=variable(s))
      (KEEP=variable(s))
      • data work (drop=age group);
      • set clinic    (keep=age group BMI );
      • 讀檔時 (SET) 只進 age group BMI ,新資檔(DATA) 刪除 age group,最後輸出只有BMI
  • 在 DATA step 的statement
    • DROP variable(s) ;
      KEEP variable(s);

2014年4月23日 星期三

準備Base programming 筆記_HTML Output

ODS 有很多 Destinations,其中常用的是 LISTING, HTML, OUTPUT, PDF 等。

輸出 ODS HTML
  1. ODS HTML BODY="file-specification"   STYLE=style-name;               
                    /* BODY 可用 FILE*/
  2. ODS HTML BODY=fileref;  * 特定檔案才可;
  3. ODS HTML PATH=mine.mycat BODY=name.HTML;
    • procedure 1 ~ procedure N
  • ODS HTML CLOSE;


多張表,製作 Table of Contents
  • 以 frame.html 為主,裡頭紀錄 content 與 body的路徑,因此有相對、絕對路徑兩種設定方式,讀檔時按 frame.html即可。
  • 相對路徑的寫法 1  (檔案一起搬到別的資料匣也能正確開啟)
    • ods html   
    • body="z:\DATA\data.html"       (url='data.html') 
    • contents="z:\DATA\toc.html"   (url='toc.html')
    • frame="z:\DATA\frame.html";
  • 相對路徑的寫法 2
    • ods html   path="z:\DATA\"  (url=none)
    • body="data.html"    
    • contents="toc.html" 
    • frame="frame.html";
  • 絕對路徑的寫法
    •  (URL='某個真的 url') 
    • 需再將三個檔案部署到正確的網址