2017-08-26 12 views
0

(symput/symgetを呼び出す)マクロ変数に基づいて繰り返しrecodeの変数にループをかけ、私はDATA1それを呼び出すするつもりです:私がしたい私はこのようになりますデータセットを持って

data1

dv = 1のときのss、out1およびout2変数の値を、dv = 0のときに各 "var"グループ内の値に再コード化します。私が欲しい結果データセットは次のようになり、のはDATA2を呼び出してみましょう:

data2

私は、次のコード使用して結果を得ることができた:より多くがあった場合、私は思っていた

data _null_; 
    set data1; 
    if dv=0 then do; 
    if var=0 then call symput("out1_0",out1); 
    if var=0 then call symput("out2_0",out2); 
    if var=0 then call symput("ss_0",ss); 

    if var=1 then call symput("out1_1",out1); 
    if var=1 then call symput("out2_1",out2); 
    if var=1 then call symput("ss_1",ss); 

    if var=2 then call symput("out1_2",out1); 
    if var=2 then call symput("out2_2",out2); 
    if var=2 then call symput("ss_2",ss); 

    if var=3 then call symput("out1_3",out1); 
    if var=3 then call symput("out2_3",out2); 
    if var=3 then call symput("ss_3",ss); 

    if var=4 then call symput("out1_4",out1); 
    if var=4 then call symput("out2_4",out2); 
    if var=4 then call symput("ss_4",ss); 
    end; 
run; 

data data2; set data1; 
    if dv=1 then do; 
    if var=0 then out1=symget("out1_0"); 
    if var=0 then out2=symget("out1_0"); 
    if var=0 then ss=symget("ss_0"); 

    if var=1 then out1=symget("out1_1"); 
    if var=1 then out2=symget("out2_1"); 
    if var=1 then ss=symget("ss_1"); 

    if var=2 then out1=symget("out1_2"); 
    if var=2 then out2=symget("out2_2"); 
    if var=2 then ss=symget("ss_2"); 

    if var=3 then out1=symget("out1_3"); 
    if var=3 then out2=symget("out2_3"); 
    if var=3 then ss=symget("ss_3"); 

    if var=4 then out1=symget("out1_4"); 
    if var=4 then out2=symget("out2_4"); 
    if var=4 then ss=symget("ss_4"); 
    end; 
run; 

をそれを行う効率的な方法?たとえば、 "var"変数の値が0から20の場合、この例では0から4の代わりに、 "var"のレベル数に基づいてコードを書き換えるループを使用します。

ご協力いただきありがとうございます、ありがとうございます!

+0

なぜ参加しないのですか? – Reeza

+0

詳しいことはありますか?どのテーブルに参加しますか? – Rosekendall

答えて

1

マクロ変数をまったく使用しないでください。あなたはそれ自身とデータを結合し、DVの値に基づいて適切な値を選択することができます。

proc sql ; 
    create table data2 as 
    select a.var 
     , a.dv 
     , case when (a.dv=1) then b.out1 else a.out1 end as out1 
     , case when (a.dv=1) then b.out2 else a.out2 end as out2 
     , case when (a.dv=1) then b.ss else a.ss end as ss 
    from data1 a 
    left join (select * from data1 where dv=0) b 
    on a.var = b.var 
    ; 
quit; 

あなたはVARの値から動的にマクロ変数名を生成することによって、反復コーディングの多くを救うことができるマクロ変数の多くを生成したいなかった場合。

call symputx(cats('out1_',var),out1); 
call symputx(cats('out2_',var),out2); 
call symputx(cats('ss_',var),ss); 
+0

ありがとうございます。コールシムジェットを使用して対応する変数にコールシンプルに基づいて値を割り当てるためにループを使用しようとしています。私が提供したコードは動的ではありませんが、私が望む結果を得ました。私は、入力データファイルを転置し、変数を記録し、変換し直すことで、より効率的に行う方法を考え出しました。私はこれを続けて、データセットを2回変換することなく、私が望む結果に到達できるかどうかを確認します。 – Rosekendall

+0

あなたのSQLコードがうまくいきました、ありがとう! – Rosekendall

関連する問題