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
来实现此功能。另外我应该提一下,我的真正问题稍微复杂一些,而且我已经有了一个凌乱的暴力方法,但我正在寻找一些干净的东西。
答案 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()函数。