2015-09-25 90 views
0

我使用SAS來的數據集分成具有以下命名約定的子集:sub001,sub002,sub003 ....我的數據集看起來像SAS:如何將數據按順序拆分爲名稱的子集。

ID var1 
AA ... 
AA ... 
AB ... 
AC ... 
... ... 
AZ ... 
... ... 
ZZ ... 

我可以手動執行此操作。

data sub001 sub002.....sub676; 
set data; 
if id='AA' then output sub001; 
..... 
if id='ZZ' then output sub676; 
run; 

但是有沒有簡單的方法可以做到這一點?我認爲%macro%do可以在這裏幫助。

+1

請顯示你已經嘗試過。另外,你確定你想要這樣做嗎?像這樣分割數據通常是一個低效率的解決方案。如果你描述你爲什麼要分割數據,人們可能會給你更好的選擇。 – Quentin

+2

ID的每個值是否成爲其自己的子集?如果是這樣,爲什麼不在以後的分析中使用BY ID語句而不是製作許多小數據集? – Tom

回答

0

如果您正在尋找將它們全部分割成一堆數據集,可以使用宏來完成。這是中宏編程我最喜歡的小動作之一:

第1步:閱讀所有不同的ID添加到一個空格分隔的宏變量

proc sql noprint; 
    select distinct strip(upcase(id)) 
    into :all_ids separated by ' ' 
    from have; 
quit; 

步驟2:循環在總的話中&all_ids上的& all_ids

options nonotes; 

%macro split; 
    %do i = 1 %to %sysfunc(countw(&all_ids)); 
     data sub_&i; 
      set have; 
      where upcase(ID) = "%scan(&all_ids, &i)"; 
     run; 
    %end; 
%mend; 
%split; 

options notes; 

每個值過濾have因爲我們循環在托特空格分隔的宏變量&all_ids中的單詞數目在&i的值與每個單詞的位置在&all_ids之間存在1-1對應關係。例如:

&i |  &all_ids  
LOOP WORD NUMBER  WORD   
1   1    AA 
2   2    AB 
3   3    AC 

這是不這樣做,因爲我們每次寫入新的數據集到磁盤的最有效方法,但除非你的資源是非常有限的,或者你有數以百計一個可怕的數據集和數百GB或更多,它應該很快完成。如果您需要一種方式來減少I/O,我也可以幫助您。