公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2007年2月22日 星期四

Using the DATASETS Procedure

原文載點:http://www2.sas.com/proceedings/sugi31/032-31.pdf

這篇是 David Fickbohm 在06年的 SUGI 31發表的報告。主要是在講一個很簡單的 SAS 程序「PROC DATASETS」。一般的資料都是在 SAS 的 Data statment 中處理,但這個程序可以加強一些效果。

GETTING TO KNOW PROC DATASETS

首先要瞭解最基本的寫法:
PROC DATASETS options;
COMMANDS options;
QUIT; RUN;


裡面可以放下面這些語法:
Detail / Nodetails – 控制觀測值、變數和標籤的 output。
List / Nolist – 控制檔案路徑的輸出。預設值:LIST。
Library – 指定 SAS Library。如果沒指定,則預設值是最後出現過的 library。如果之前都沒有使用 library,SAS會自動指向 work library。
FORCE – 無論有無 error 都強制執行此程序。
MEMTYPE – specifies the member type. (<=還沒搞清楚這要幹啥!) NOWARN - 抑制 warning messages 在 log 出現。

DETERMINING THE CONTENTS OF A LIBRARY


其實 PROC DATASETS 可以跑出跟 PROC CONTENTS 一樣的結果:

PROC CONTENTS DATA = XX06._ALL_ NODS;

David 特別強調 PROC DATASET 用的 keyword 比較少,但用順的人應該覺得沒差。

DETERMINING THE CONTENTS OF A LIBRARY AND THE ATTRIBUTES OF THE VARIABLES IN THE DATASETS

這段主要在講,在 PROC DATASETS 後的 option 寫上 all 的話可以列出所有資料訊息。

MANIPULATING FILES

PROC DATASETS 可以快速拷貝和移動資料到不同的 library,程式如下所示:

LIBNAME SS06 "C:\TEMP1";
LIBNAME KEPR "T:\DAVEKEEP";
PROC DATASETS;
COPY IN = SS06 OUT = KEPR;
QUIT; RUN;


簡單說,就是把 SS06 裡面所有的資料複製到 KEPR 的路徑下。

LIBNAME SS06 "C:\TEMP1";
LIBNAME KEPR "T:\DAVEKEEP";
PROC DATASETS;
COPY IN = SS06 OUT = KEPR;
SELECT AAA BBB;
QUIT; RUN;


上面這個比較進階,只有複製 SS06 底下的 AAA 和 BBB 這兩個資料到 KEPR 路徑下而已。

LIBNAME SS06 "C:\TEMP1";
LIBNAME KEPR "T:\DAVEKEEP";
PROC DATASETS;
COPY IN = SS06 OUT = KEPR;
EXCLUDE CCC;
QUIT; RUN;


想反地,如果想要拷貝除了 CCC 以外的資料,就用 EXCLUDE 來限定。

除此之外,還有一些施展「大絕招」的功能。

LIBNAME SS06 "C:\TEMP1";
PROC DATASETS LIBRARY = SS06;
SAVE AAA BBB;
QUIT; RUN;


用 SAVE 指令可以「只」儲存 AAA 和 BBB 兩個資料,其餘的會「全部刪除」。

LIBNAME SS06 "C:\TEMP1";
PROC DATASETS LIBRARY = SS06;
DELETE AAA BBB;
QUIT; RUN;


反過來,用 DELETE 指令只會刪除 AAA 和 BBB,其他檔案的小命都會保住。

LIBNAME SS06 "C:\TEMP1";
PROC DATASETS LIBRARY = SS06 KILL;
QUIT; RUN;


最強的大絕招「KILL」指令一施展,SS06 底下所有的資料都會被刪除。為此,David特別下了一個註解:BE VERY CAREFUL with KILL.

THE USE OF APPEND VS SET

有時想要合併許多資料,就可以用 APPEND 和 SET 指令。其實就跟 SAS/DATA 程序一樣。

PROC DATASETS LIBRARY = WORK FORCE;
APPEND OUT = MAY05_CLAIMS DATA = JUNE05_CLAIMS;
QUIT; RUN;


上面的程式是要把
JUNE05_CLAIMS 資料 append 到 MAY05_CLAIMS 這個資料。FORCE option在這邊可以強制合併不同的變數、資料型態和資料長度。David 強烈推薦這個 option。

THE USE OF CHANGE

這是拿來改資料檔名的。

PROC DATASETS LIBRARY = YY;
CHANGE MAY05_CLAIMS = MAY_JUNE05_CLAIMS;
QUIT; RUN;


THE USE OF AGE

有個滿奇怪的語法叫做 AGE。這個語法可以做批次檔名修改。

proc datasets library=daily nolist;
age today day1-day7;
quit; run;


上面是 David 給的範例,他的說明是「add day1 to the library and delete day7」,並給了下面這串 log:

LOG LISTING NOTE:
Deleting DAILY.DAY7 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY6 to DAILY.DAY7 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY5 to DAILY.DAY6 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY4 to DAILY.DAY5 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY3 to DAILY.DAY4 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY2 to DAILY.DAY3 (memtype=DATA).
NOTE: Ageing the name DAILY.DAY1 to DAILY.DAY2 (memtype=DATA).
NOTE: Ageing the name DAILY.TODAY to DAILY.DAY1 (memtype=DATA).

我還沒完全搞懂用意。="=|||

THE MODIFY COMMAND

MODIFY 指令主要是給人修改資料標籤的。

PROC DATASETS LIBRARY = WORK;
MODIFY JUN05_PAYMENTS (LABEL = "NEW_MEMBER_LABEL");
RENAME OLD_VARIABLE_NAME = NEW_VARIABLE_NAME;
LABEL NEW_VARIABLE_NAME = LABEL_FOR_RENAMED_VARIABLE;
FORMAT EXISTING_VARIABLE_NAME COMMA11.2;
QUIT; RUN;


這個程式一共進行四項動作:
(一)加了個標籤到 JUNE05_PAYMENTS 資料裡面。
(二)改了變數名稱。
(三)給這個新的變數名稱一個新的標籤。
(四)給一個舊的變數新的格式。

注意:RENAME 指令只能用在 MODIFY 指令後面。

AUDIT STATEMENT

這個功能是可以用來記錄你對資料幹了啥麼好事。

PROC DATASETS LIB = MYLIB;
AUDIT MAY_SALES;
INITIATE;
QUIT; RUN;


使用 INITIATE 時,系統會建立一個和 MAY_SALES 同樣檔名但是 type 卻是 audit 的檔案,舉凡任何新增、更新或刪除的動作都會被記錄下來。

PROC DATASETS LIB = MYLIB;
AUDIT MAY_SALES;
SUSPEND;
QUIT; RUN;


SUSPEND 指令可以保證 audit 檔暫時不會被刪除。

PROC DATASETS LIB = MYLIB;
AUDIT MAY_SALES;
RESUME;
QUIT; RUN;


如果檔案已經被 suspend,則可以用 RESUME 指令來還原所有紀錄。

PROC DATASETS LIB = MYLIB;
AUDIT MAY_SALES;
TERMINATE;
QUIT; RUN;


TERMINATE 指令可以終止記錄並且刪除 audit 資料。

PROC DATASETS LIB = MYLIB;
EXCHANGE SALES = JUN_SALES;
QUIT; RUN;


EXCHANGE 可以交換兩個資料的檔名。

CONTACT INFORMATION
Please feel free to contact me with questions and comments about this paper:
David Fickbohm
HomeGain+
1250 45th St. Suite 200 Emeryville, CA 94608
510 594 4151 day phone
510 655 0848 fax
davidf@homegain.com

(PS)每個程式都有一個 QUIT 指令,這可用可不用,看個人習慣。

沒有留言:

張貼留言

要問問題的人請在文章下方的intensedebate欄位留言,請勿使用blogger預設的意見表單。今後用blogger意見表單留言的人我就不回應了。

CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }