2013-01-17 30 views
0

我有多個變量的大型數據集。SAS出把數據集從變量類別

使用兩個這些變量,ET1和BL1的,我想每個變量的類別創建輸出數據集。

ET1有七個電平,其被編碼爲數字(儘管我有被施加到數字的類別的格式。

BL1具有四個電平,其也編碼爲數字(再次有這種格式以及)。

我想創建28個輸出數據集(ET1 * 7和BL1 * 4 = 28),理想地使用格式名稱作爲數據集名稱。

乾杯, 約翰

+0

你有問題嗎? – Zyerah

+1

爲什麼你想創建這麼多的數據集?對我來說這似乎是一個非常糟糕的主意。將數據保存在一個數據集中,並根據需要使用它。你想在這裏做什麼? – Joe

+2

我同意喬的觀點,你可能錯誤地處理了這個問題。如果你堅持創建28個數據集,那麼我建議如果根據您的ET1和BL1變量的值/ THEN/ELSE語句輸出到數據集硬編碼在28。還有更有效的和動態的方式與宏處理和/或陣列要做到這一點,但你需要提供你嘗試什麼之前,我會建議編碼它的一個更好的例子。 – RWill

回答

2
proc format; 
value classa 
    1='ADATA' 
    2='BDATA' 
; 
value classb 
    1='CDATA' 
    2='DDATA' 
; 
run; 

data in; 
length class_a class_b $ 8; 
do i=1 to 2; 
    do j=1 to 2; 
     class_a=trim(left(put(i,classa.))); 
     class_b=trim(left(put(j,classb.))); 
     someVar=ranuni(0); 
     someOtherVar=ranuni(0); 
     output; 
    end; 
end; 
run; 



options mprint symbolgen mlogic; 

%macro separate(dsn=, classvar1=, classvar2=); 

proc sql; 
select distinct trim(left(&classvar1)) || '_' || trim(left(&classvar2)) 
into :dsnames separated by ' ' 
from &dsn; 
quit; 

data &dsnames.; 
set &dsn; 
%let idx=1; 
%let thiscombo=%sysfunc(scan(&dsnames,&idx,%str())); 
%do %while(%length(&thiscombo) > 0); 
IF (&classvar1 = %sysfunc(quote(%sysfunc(scan(&thiscombo,1,%str(_))))) AND 
    &classvar2 = %sysfunc(quote(%sysfunc(scan(&thiscombo,2,%str(_)))))) 
    THEN OUTPUT &thiscombo; 
    %let idx=%eval(&idx+1); 
    %let thiscombo=%sysfunc(scan(&dsnames,&idx,%str())); 
%end; 
run; 

%mend; 

%separate(dsn=in, classvar1=class_a, classvar2=class_b); 
+0

不錯,我在想同樣的一般方法。有可能在沒有明確形成宏的情況下做到這一點。通過在proc sql中形成if語句。儘管你可能想向proc sql添加noprint,但這更多的是樣式問題。 –