2015-02-11 124 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 ;