公告

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

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


2007年2月27日 星期二

Splitting a Large SAS® Data Set

原文載點:http://www2.sas.com/proceedings/sugi28/075-28.pdf

當處理龐大檔案,若沒有很強的硬體設備,通常我們會建議將檔案稍做一些切割以便分別處理。但 SAS 中沒有任何指令是可以任意切割資料,即便最簡單的「均分」都沒有指令提供。Selvaratnam Sridharma 於 2003 年的 SUGI 28 發表了一篇關於切割資料的文章,並寫了兩個小 macro 分享給大家。


The %split1 Macro

第一個 macro 程式可供使用者將資料切割成數塊,每一塊包含 n 個觀測值,SAS 會自動命名新的小資料集,而切剩的資料會放進最後一個小資料集中(此資料的觀測值總數就會小於 n)。

%macro split1(num);
data _null_;
if 0 then set orig nobs=count;
call symput('numobs',put(count,8.));
run;
%let m=%sysevalf(&numobs/&num,ceil);
data %do J=1 %to &m ; orig_&J %end; ;
set orig;
%do I=1 %to &m;
if %eval(&num*(&i-1)) <_n_ style="color: rgb(51, 51, 255);">%mend split1;


範例:

data orig;
do i =1 to 84;
output;
end;
run;
%split1(18);


資料集 orig 會被切割成五塊(orig_1~orig_5)。前四塊各含 18 個觀測值,最後一個則只有 15 個觀測值。

The %split2 Macro

第二個 macro 會將檔案切成 n 塊,每塊的觀測值會相等。同樣地,切剩的資料仍舊會被丟到最後一個資料集中。

%macro split2(num);
data _null_;
if 0 then set orig nobs=count;
call symput('numobs',put(count,8.));
run;
%let n=%sysevalf(&numobs/&num,ceil);
data %do J=1 %to &num ; orig_&J %end; ;
set orig;
%do I=1 %to #
if %eval(&n*(&i-1)) <_n_ style="color: rgb(51, 51, 255);">%mend split2;


範例:

data orig;
do i =1 to 85;
output;
end;
run;
%split2(6);


資料集 orig 會被切成六塊(orig_1~orig_6)。前五塊各含 15 個觀測值,最後一個資料集則只有 10 個觀測值。

Contact Information
Selvaratnam Sridharma
U.S. Census Bureau
4700 Silver Hill Road, Stop 8400
Washington, D.C. 20233
301-763-5398

沒有留言:

張貼留言

要問問題的人請在文章下方的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; }