2015-02-11 122 views
0

this類似的問題,我的情況有點不同,即變量名稱是Var12,Var 24,Var36而不是Var1 Var2和Var3。sas中的動態變量名稱

它給出數組下標超出範圍錯誤。

data have; 
input Index Var12 Var2 Var3; 
cards; 
12  78.3 54.7 79.8 
36  67.2 56.2 12.3 
24  65.3 45.2 98.1 
12  56.2 49.7 11.3 
12  67.2 98.2 98.6 
; 
run; 

data want; 
set have; 
array vars(*) var: ; 
var_index=vars(Index); 
run; 

回答

4

反而看看vvaluex函數。它允許你指定一個定義變量的字符串,而vvalue則需要一個變量名(不是字符串)。

Var_index=vvaluex('var'||put(index, 2. -l)); 
+2

這對我來說似乎最簡單。我添加了一些解釋,所以答案更完整。 – Joe 2015-02-11 15:29:03

0

既然你有3個變量與名稱以VAR,3個數值變量的陣列將被創建,因此索引值應該是3。

1之間大於3的任何值將給出的範圍錯誤。你可以使用dim函數來找出已聲明數組中元素的個數。

代碼語句:

num_val = dim(vars); 
+0

這將是一個很好的評論,因爲它指出了代碼中的錯誤,但它實際上並沒有回答這個問題 - 問題是如何創建'var_index',此不做。 – Joe 2015-02-11 15:31:54

1

我認爲你必須在你的input聲明一個錯字...

假設它應該是

 
input Index Var12 Var24 Var36 ; 

那麼這個代碼的工作,如果輸入var字段具有任何數字後綴並且以任意順序:

 
data want ; 
    set have ; 
    array vars{*} var: ; 
    var_index = . ; 
    do i = 1 to dim(vars) ; 
    /* Get variable name of vars{i}, keep only digits, compare to var_index */ 
    /* If they match, store the value from vars{i} */ 
    if input(compress(vname(vars{i}),,'kd'),8.) = index then var_index = vars{i} ; 
    end ; 

    drop i ; 
run ;