0

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

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

真正有帮助的是类似于

vvaluex(var2)=var1

除了 vvaluex 不能在等号的左侧。有什么想法或想法吗?

4

1 回答 1

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 应该更快,并且可能更灵活,但这对于某些目的可能会更好。

于 2013-04-18T18:08:33.237 回答