SAS中的动态变量名称

时间:2012-05-29 11:39:01

标签: variables dynamic sas

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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

我认为最简单的解决方案是使用VVALUEX功能。它使用索引创建变量名称,然后将其作为参数提供给函数 -

var_index = vvaluex(compress("var" || put(index, 8.)));

答案 2 :(得分: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;

我可能会遗漏一些东西?但这应该会给你问题的结果。

答案 3 :(得分: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()函数。