2013-04-18 102 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應該是更快,可能是更靈活,但是這可能工作一段美好目的。