顯示具有 Point 標籤的文章。 顯示所有文章
顯示具有 Point 標籤的文章。 顯示所有文章

2014年4月28日 星期一

運用 Do loop 整理資料

  • /*
    DO index-variable=start TO stop BY increment;
    SAS statements
    END;
    */
    • data test;
      Amount=1000;
      Rate=.075/12;
      do month=1 to 12; /*開始 Iteration */
          Earned+(amount+earned)*rate;
      end;  /*month 跑到 13 才停,因此最後是 13 */
      run;  /*輸出 所有變項值*/
    • do i=1 to Years;
      變項也可以當成 Stop 的依據
    • /*Decrementing DO Loops ,最後到 1 結束*/
    • a Series of Items
      • DO index-variable=
        2,5,9,13,27;
      • DO index-variable=
        'MON','TUE','WED','THR','FRI';
      • DO index-variable=
        Spring, Summer, Fall , Winter;  變項值

/*Nesting DO Loops*/
  • data work.earn;
    do year=1 to 20; /*每年增資*/
        Capital+2000;
        do month=1 to 12; /*每月複利*/
            Interest=capital*(.012/12);
            capital+interest;
        end;
    end;
    run;

/*Conditionally Executing DO Loops*/
  • /* DO UNTIL(expression); */
    在程式底才判斷,因此statement一定至少執行一次
    • data invest;
          do until (Capital>=9000);
              capital+1000;
              capital+capital*.10;
              Year+1;
              output;
          end;
      run;
      proc print noobs;run;
    • data invest;
          do Year=1 to 10  until (Capital>=20000);
              capital+1000;
              capital+capital*.10;
              output;
          end;
      if year=11 then year=10;
      /*index-variable 跑足就會多 1  */
      run;
      proc print noobs;run;
    • data invest;         /*依 condition 提早結束*/
          do Year=1 to 10  until (Capital>=20000);
              capital+5000;
              capital+capital*.10;
              output;
          end;
          if year=11 then year=10;
      run;
      proc print noobs;run;
  • /* DO WHILE(expression); */
    在程式初就判斷,因此statement可能完全不執行
    • data invest;
          do while (Capital>=9000);
      *不會執行,因為初始是 0 ,要 >= 9000 才會動;
              capital+1000;
              capital+capital*.10;
              Year+1;
              output;
          end;
      run;

系統抽樣 搭配 Point-Output-Stop
  • DATA TT;
        Do sample=1 to 206 by 5 ;
            SET SASUSER.frequentflyers  point=sample;
            Output;
        End;
                    Stop;
    RUN;

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建立的變項,自動變項