3

SASで動的変数名をコードで指定する方法はありますか? つまり、別の変数の値に基づいて、異なる観察で異なる変数を使用しますか?

たとえば、入力データ セットは次のようになります。

Index  Var1   Var2  Var3
1      78.3   54.7  79.8
3      67.2   56.2  12.3
2      65.3   45.2  98.1
1      56.2   49.7  11.3
1      67.2   98.2  98.6

そして、Var*Index* の値を保持する列を追加したいと考えています。つまり、私が望む出力は次のようになります。

    Index  Var1   Var2  Var3  Var_Index
    1      78.3   54.7  79.8  78.3
    3      67.2   56.2  12.3  12.3
    2      65.3   45.2  98.1  45.2
    1      56.2   49.7  11.3  56.2
    1      67.2   98.2  98.6  67.2

これを機能させるために使用call symputすることはできません。また、私の実際の問題はもう少し複雑であり、すでに乱雑なブルート フォース メソッドを使用していますが、きれいなものを探しています。

4

4 に答える 4

3

Var1 - VarN の配列を作成すると、Index に格納された値を簡単に参照できます。

data have;
input Index  Var1   Var2  Var3;
cards;
1      78.3   54.7  79.8
3      67.2   56.2  12.3
2      65.3   45.2  98.1
1      56.2   49.7  11.3
1      67.2   98.2  98.6
;
run;

data want;
set have;
array vars(*) var: ;
var_index=vars(index);
run;
于 2012-05-29T12:14:02.887 に答える
2

最も簡単な解決策は、VVALUEX 関数を使用することだと思います。インデックスを使用して変数名を作成し、それを引数として関数に提供します-

var_index = vvaluex(compress("var" || put(index, 8.)));
于 2012-06-07T11:09:29.323 に答える
0
data want;
    set have;
    length _var_name $32 _var_num 5;
    array vars(*) var: ;
    /* if you want name of variable */
    _var_name=VNAME(vars(index));
    /* if you want numeric suffix of variable 
            and suffix is not same as position of variable in array
          (so that vars(index) is not usable */
    _var_num=INPUT(SUBSTR(_var_name, ANYDIGIT(_var_name)),32.);
run;

したがって、必要なのは VNAME() 関数です。

于 2012-05-31T13:47:40.633 に答える
0

データステップは機能しませんか?

 data assign_value;
  set have;

  if index = 1 then var_index = var1;
  else if index = 2 then var_index = var2;
  else if index = 3 then var_index = var3;
run;

私は何かが欠けているかもしれませんか?しかし、これで質問の結果が得られるはずです。

于 2012-05-29T11:54:15.333 に答える