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 回答