假設你能告訴多少行每個變量的使用計數非遺漏值有多少列,那麼你可以使用此代碼生成技術來生成將使用POINT =選項設置數據的步驟語句循環遍歷變量X的第一個Nx觀察值。
首先獲取變量名稱列表;
proc transpose data=have(obs=0) out=names ;
var _all_;
run;
然後使用它們來生成PROC SQL select語句來計算每個變量的非缺失值的數量。
filename code temp ;
data _null_;
set names end=eof ;
file code ;
if _n_=1 then put 'create table counts as select ' ;
else put ',' @;
put 'sum(not missing(' _name_ ')) as ' _name_ ;
if eof then put 'from have;' ;
run;
proc sql noprint;
%include code /source2 ;
quit;
然後轉置,這樣你再有每個變量名一行但這次它也有COL1計數。
proc transpose data=counts out=names ;
var _all_;
run;
現在使用它來生成DATA步驟所需的SET語句以從輸入創建輸出。
filename code temp;
data _null_;
set names ;
file code ;
length pvar $32 ;
pvar = cats('_point',_n_);
put pvar '=mod(_n_-1,' col1 ')+1;' ;
put 'set have(keep=' _name_ ') point=' pvar ';' ;
run;
現在使用生成的語句。
data want ;
set have(drop=_all_);
%include code/source2;
run;
所以與變量A,B和C和7個總觀測日誌中產生的數據步的示例數據文件是這樣的:
1229 data want ;
1230 set have(drop=_all_);
1231 %include code/source2;
NOTE: %INCLUDE (level 1) file CODE is file .../#LN00026.
1232 +_point1 =mod(_n_-1,7)+1;
1233 +set have(keep=a) point=_point1 ;
1234 +_point2 =mod(_n_-1,3)+1;
1235 +set have(keep=b) point=_point2 ;
1236 +_point3 =mod(_n_-1,2)+1;
1237 +set have(keep=c) point=_point3 ;
NOTE: %INCLUDE (level 1) ending.
1238 run;
NOTE: There were 7 observations read from the data set WORK.HAVE.
NOTE: The data set WORK.WANT has 7 observations and 3 variables.
來源
2017-06-23 22:24:57
Tom
在同一數據集所有這些是最初?看起來像一個不好的合併? – Reeza
是的,它實際上是一個「壞」合併。但是這不會影響目標。我想知道如何從矢量a,b和c得到這張決賽桌。 – fossekall
我問這個問題的原因是,如果你已經有了單獨的數據集中的數據,它可以更容易地加載到臨時數組或設置一個SQL步驟。首先「邁出」一步可能會使這個問題更容易處理。您已經有解決方案,因此您可以隨意忽略這一點,因爲您已經實現了「目標」。 – Reeza