0

最大 4 までのラグを持つ変数 (VarA、VarB、VarC など) の名前を使用して形成された (SAS 内の) データ セットに動的エントリを作成したいと考えています。

入力データセット HAVE には次の情報があります (列名は変数と値です)。

Variables Values

VarA          0

VarB          0

VarC          0

Lags          4

出力データセット WANT は次のようになります (Var1、Var2、および Var3 は動的な列名です。つまり、任意の文字列 Var に 1,2,3 を追加します)。

Var1     Var2      Var3

VarA     VarB      VarC 

VarA1    VarB1     VarC1

..

VarA4    VarB4     VarC4

これは、HAVE データ セット内の任意の数の変数に対して機能することを目的としています。

ありがとう

4

1 に答える 1

1

次のコードは、必要なものを返します。必要に応じて変更してください。

/*sample input dataset*/
data have;
input Variables $ Values;
datalines;
VarA 0
VarB 0
VarC 0
Lags 4
;
run;
/*get the no. of lags form the input dataset*/
proc sql noprint;
select Values into :num_of_lags from have where upcase(variables)='LAGS';
quit;
/*transpose the input dataset such that the VarA, VarB, VarC are put in columns Var1, Var2, & Var3 respectively*/
/*have_t, the transposed dataset only has 1 row.*/
proc transpose data = have out =  have_t(drop = _name_) prefix = var;
where upcase(variables)  ne 'LAGS';
var variables;
run;
/*replicate the 1 row in have_t num_of_lags times*/
data pre_want;
    set have_t;
    array myVars{*} _character_;
        do j= 1 to &num_of_lags+1;
            do i = 1 to dim(myVars);
            myVars[i]=myVars[i];
            end;
        output;
    end;
run;
/*final dataset*/
data want;
set pre_want;
array myVars{*} _character_;
if _N_>1 then do;
do i = 1 to dim(myVars);
        myVars[i]=compress(myVars[i]!!_n_-1);
    end;
end;
drop i j;
run;
proc print data = want; run;

出力:

var1  var2  var3 
VarA  VarB  VarC 
VarA1 VarB1 VarC1 
VarA2 VarB2 VarC2 
VarA3 VarB3 VarC3 
VarA4 VarB4 VarC4 
于 2013-06-24T19:58:01.647 に答える