2013-04-18 103 views
0

我想根据其他变量中包含的数据创建SAS变量名称。例如,我可以开始与来自其他变量的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不能上等号的左边。任何想法或想法?

回答

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应该是更快,可能是更灵活,但是这可能工作一段美好目的。