我正在尝试根据其他变量中包含的数据创建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个),这些变量稍后在内部调用数据步循环。它工作但很复杂,我认为不会很好地扩展到真实数据,它包含每行创建多个变量,以及几千行。
我也尝试过使用数组 - 在宏变量中保存变量名,使用它来生成数组语句,并尝试跟踪每个新变量需要哪个数组索引,但它也很复杂。
真正有用的东西是类似于
的东西vvaluex(var2)=var1
除了vvaluex不能在等于的左侧。有什么想法或想法吗?
答案 0 :(得分:0)
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应该更快,可能更灵活,但这可能会更好地用于某些目的。