0

他の変数に含まれるデータに基づいて SAS 変数名を作成しようとしています。たとえば、私はから始めることができます

Obs  Var1  Var2
  1   abc     X
  2   def     X
  3   ghi     Y
  4   jkl     X

そして、私はで終わりたいです

Obs  Var1  Var2    X    Y
  1   abc     X   abc   
  2   def     X   def   
  3   ghi     Y        ghi
  4   jkl     X   jkl   

これを行う方法は 1 つありますが、最初に必要な変数を (長さステートメントを使用して) 作成し、次にデータ ステップ ループ内で後で呼び出される一連の番号付きマクロ変数 (観察ごとに 1 つ) を作成するために、やや醜いマクロが必要です。 . それは機能しますが、複雑であり、行ごとに作成するための複数の変数と数千行を含む実際のデータにうまくスケーリングするとは思いません。

変数名をマクロ変数に保存し、それを使用して配列ステートメントを生成し、新しい変数ごとに必要な配列インデックスを追跡しようとしましたが、これも複雑です。

本当に役立つのは、

vvaluex(var2)=var1

ただし、vvaluex を等号の左側に置くことはできません。考えやアイデアはありますか?

4

1 に答える 1

0

PROC TRANSPOSE は、質問の例を実行する便利な方法です。

data have;
input Obs  Var1 $  Var2 $;
datalines;
1   abc     X
2   def     X
3   ghi     Y
4   jkl     X
;;;;
run;

proc transpose data=have out=want;
by obs;
id var2;
var var1;
copy var1 var2;
run;

別のオプションは、配列と VNAME を使用して、おそらく以前に試したものと似ています。

proc sql;
select var2 into :var2list separated by ' ' from have;
quit;

data want;
set have;
array newvars $ &var2list;
do _t = 1 to dim(newvars);
  if vname(newvars[_t]) = Var2 then do;
    newvars[_t] = var1;
    leave;
  end;
end;
run;

PROC TRANSPOSE はより高速で、おそらくより柔軟であるはずですが、これはいくつかの目的ではよりうまく機能する可能性があります。

于 2013-04-18T18:08:33.237 に答える