0
我有多個變量的大型數據集。SAS出把數據集從變量類別
使用兩個這些變量,ET1和BL1的,我想每個變量的類別創建輸出數據集。
ET1有七個電平,其被編碼爲數字(儘管我有被施加到數字的類別的格式。
BL1具有四個電平,其也編碼爲數字(再次有這種格式以及)。
我想創建28個輸出數據集(ET1 * 7和BL1 * 4 = 28),理想地使用格式名稱作爲數據集名稱。
乾杯, 約翰
我有多個變量的大型數據集。SAS出把數據集從變量類別
使用兩個這些變量,ET1和BL1的,我想每個變量的類別創建輸出數據集。
ET1有七個電平,其被編碼爲數字(儘管我有被施加到數字的類別的格式。
BL1具有四個電平,其也編碼爲數字(再次有這種格式以及)。
我想創建28個輸出數據集(ET1 * 7和BL1 * 4 = 28),理想地使用格式名稱作爲數據集名稱。
乾杯, 約翰
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);
不錯,我在想同樣的一般方法。有可能在沒有明確形成宏的情況下做到這一點。通過在proc sql中形成if語句。儘管你可能想向proc sql添加noprint,但這更多的是樣式問題。 –
你有問題嗎? – Zyerah
爲什麼你想創建這麼多的數據集?對我來說這似乎是一個非常糟糕的主意。將數據保存在一個數據集中,並根據需要使用它。你想在這裏做什麼? – Joe
我同意喬的觀點,你可能錯誤地處理了這個問題。如果你堅持創建28個數據集,那麼我建議如果根據您的ET1和BL1變量的值/ THEN/ELSE語句輸出到數據集硬編碼在28。還有更有效的和動態的方式與宏處理和/或陣列要做到這一點,但你需要提供你嘗試什麼之前,我會建議編碼它的一個更好的例子。 – RWill