Вопрос по – Имена динамических переменных в SAS

3

Есть ли способ в 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 *. то есть результат, который я хотел бы получить:

    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 чтобы заставить это работать. Также я должен отметить, что моя настоящая проблема немного сложнее, и у меня уже есть грязный метод грубой силы, но я ищу что-то чистое.

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

Ваш Ответ

4   ответа
3

вы можете легко ссылаться на значение, хранящееся в Index.

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;
Я должен был быть более ясным, когда спрашивал. Скажите, что переменные были var_IBM var_Apple и т. Д. Вместо этого? user997943
Код по-прежнему должен работать, если все переменные, которые вы хотите, начинаются с var_ (var: в моем коде означает все переменные, начинающиеся с 'var'). Если нет, то укажите первую и последнюю переменные в списке массивов, разделенные знаком «-», например, массив vars {*} a - z; Longfish
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;

Может, я что-то упустил? но это должно дать вам результат вашего вопроса.

Проблема в том, что такой подход становится беспорядочным, если вы скажете 100-200 переменных. Я надеялся на более макро-подход, я мог бы сказать, var_index = var & ind. где макропеременная ind хранит значение Index user997943
См. Код Кита ниже, если у вас их так много. DataParadigms
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;

2

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

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

Похожие вопросы