2012-05-29 2 views
3

Есть ли способ в SAS указать имена динамических переменных в коде? т. Е. Использовать разные переменные при разных наблюдениях на основе значения другой переменной?Динамические имена переменных в SAS

Например, мой входной набор данных может быть:

Index Var1 Var2 Var3 
1  78.3 54.7 79.8 
3  67.2 56.2 12.3 
2  65.3 45.2 98.1 
1  56.2 49.7 11.3 
1  67.2 98.2 98.6 

И я хочу, чтобы добавить столбец, который содержит значение Var * Индекс *. то есть выход, я бы хотел бы быть:

Index Var1 Var2 Var3 Var_Index 
    1  78.3 54.7 79.8 78.3 
    3  67.2 56.2 12.3 12.3 
    2  65.3 45.2 98.1 45.2 
    1  56.2 49.7 11.3 56.2 
    1  67.2 98.2 98.6 67.2 

Я не могу использовать call symput, чтобы получить эту работу. Также я должен упомянуть, что моя реальная проблема немного сложнее, и у меня уже есть беспорядочный метод грубой силы, но я ищу что-то чистое.

+0

@ ответ Кейта должен работать, если вы просто хотите сохранить значение из переменной VAR с именем, заканчивающимся в индексе число в var_index ... если в решении есть больше переменных, обновите свой вопрос –

ответ

0

Не работает ли шаг данных?

data assign_value; 
    set have; 

    if index = 1 then var_index = var1; 
    else if index = 2 then var_index = var2; 
    else if index = 3 then var_index = var3; 
run; 

Возможно, мне что-то не хватает? но это должно дать вам результат по вашему вопросу.

+0

Проблема в том, что такой подход становится беспорядочным, если вы скажете 100-200 переменных. Я надеялся на более макро-подход, здесь я мог бы сказать var_index = var & ind. где макропеременная ind хранит значение индекса – user997943

+0

См. ниже приведенный ниже код Кейта, если у вас их много. – DataParadigms

3

Если вы создаете массив Var1 - VarN, вы можете легко ссылаться на значение, хранящееся в индексе.

data have; 
input Index Var1 Var2 Var3; 
cards; 
1  78.3 54.7 79.8 
3  67.2 56.2 12.3 
2  65.3 45.2 98.1 
1  56.2 49.7 11.3 
1  67.2 98.2 98.6 
; 
run; 

data want; 
set have; 
array vars(*) var: ; 
var_index=vars(index); 
run; 
+0

Я должен был быть более ясным, спрашивая. Скажем, переменные были var_IBM var_Apple и т. Д.? – user997943

+2

Код должен по-прежнему работать, если все переменные, которые вы хотите, начинаются с var_ (var: в моем коде означает все переменные, начинающиеся с «var»). Если нет, укажите первую и последнюю переменные в списке массивов, разделенные символом «-», например. array vars {*} a - z; – Longfish

0
data want; 
    set have; 
    length _var_name $32 _var_num 5; 
    array vars(*) var: ; 
    /* if you want name of variable */ 
    _var_name=VNAME(vars(index)); 
    /* if you want numeric suffix of variable 
      and suffix is not same as position of variable in array 
      (so that vars(index) is not usable */ 
    _var_num=INPUT(SUBSTR(_var_name, ANYDIGIT(_var_name)),32.); 
run; 

Так что вам нужно, это функция VNAME().

2

Я думаю, что самым простым решением было бы использовать функцию VVALUEX. Он создает имя переменной с помощью индекса, а затем передает его в качестве аргумента функции -

var_index = vvaluex(compress("var" || put(index, 8.)));