Имена динамических переменных 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 не может быть слева от равенства. Есть мысли или идеи?


person donchanger    schedule 18.04.2013    source источник


Ответы (1)


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

person Joe    schedule 18.04.2013