来自其他变量的SAS动态变量名称

时间:2013-04-18 18:05:29

标签: variables sas names

我正在尝试根据其他变量中包含的数据创建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个),这些变量稍后在内部调用数据步循环。它工作但很复杂,我认为不会很好地扩展到真实数据,它包含每行创建多个变量,以及几千行。

我也尝试过使用数组 - 在宏变量中保存变量名,使用它来生成数组语句,并尝试跟踪每个新变量需要哪个数组索引,但它也很复杂。

真正有用的东西是类似于

的东西
vvaluex(var2)=var1

除了v​​valuex不能在等于的左侧。有什么想法或想法吗?

1 个答案:

答案 0 :(得分: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应该更快,可能更灵活,但这可能会更好地用于某些目的。