如何根据条件调用宏变量
How to call a macro variable based on a condition
我在 SAS 中有一个数据集
- 一个变量条件,可以取值在"01",...,"20"
- 几个由 i 索引的变量,例如 var01, ..., var20
我想做的是创建一个新变量 total 等于 vark if condition= k。我可以通过几个 if...else 语句来做到这一点(这是我现在所做的),但我没有设法以更紧凑和优雅的方式做到这一点。
我试过了
data want;
set have;
call symput(condition, temp);
total=var&temp;
run;
但它不起作用...充其量我会尝试一些解析指令,我会得到一个 total 等于 'var01' 的值等等,但只是字符,而不是与变量关联的值 var01
我的目标是比
做得更好
data want ;
set have (keep=noi nomen var01-var20 lprm condition ag);
if condition="01" then varpr=var01;
else if condition="02" then varpr=var02;
else if condition="03" then varpr=var03;
else if condition="04" then varpr=var04;
else if condition="05" then varpr=var05;
else if condition="06" then varpr=var06;
else if condition="07" then varpr=var07;
else if condition="08" then varpr=var08;
else if condition="09" then varpr=var09;
else if condition="10" then varpr=var10;
else if condition="11" then varpr=var11;
else if condition="12" then varpr=var12;
else if condition="13" then varpr=var13;
else if condition="14" then varpr=var14;
else if condition="15" then varpr=var15;
else if condition="16" then varpr=var16;
else if condition="17" then varpr=var17;
else if condition="18" then varpr=var18;
else if condition="19" then varpr=var19;
else if condition="20" then varpr=var20;
run;
谢谢
您不能那样使用宏变量 - 它必须在数据步骤之外定义。
但是,如果我理解您的目的,您可以为此使用数组。
data want;
set have;
array var[20] var01-var20;
total=var[condition];
run;
一个不同的解决方案,不使用数组,使用 vvaluex 函数:
varpr = vvaluex(catt('var', condition));
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002233818.htm
在这里你可以创建一个带循环的小宏。
想法是
%宏观条件;
%do i=1 %to 20;
如果 condition="&i" 那么 out_var=in_&var;
%结束;
%修复;
在数据步骤中使用此宏。
希望能解决你的问题
我在 SAS 中有一个数据集
- 一个变量条件,可以取值在"01",...,"20"
- 几个由 i 索引的变量,例如 var01, ..., var20
我想做的是创建一个新变量 total 等于 vark if condition= k。我可以通过几个 if...else 语句来做到这一点(这是我现在所做的),但我没有设法以更紧凑和优雅的方式做到这一点。
我试过了
data want;
set have;
call symput(condition, temp);
total=var&temp;
run;
但它不起作用...充其量我会尝试一些解析指令,我会得到一个 total 等于 'var01' 的值等等,但只是字符,而不是与变量关联的值 var01
我的目标是比
做得更好data want ;
set have (keep=noi nomen var01-var20 lprm condition ag);
if condition="01" then varpr=var01;
else if condition="02" then varpr=var02;
else if condition="03" then varpr=var03;
else if condition="04" then varpr=var04;
else if condition="05" then varpr=var05;
else if condition="06" then varpr=var06;
else if condition="07" then varpr=var07;
else if condition="08" then varpr=var08;
else if condition="09" then varpr=var09;
else if condition="10" then varpr=var10;
else if condition="11" then varpr=var11;
else if condition="12" then varpr=var12;
else if condition="13" then varpr=var13;
else if condition="14" then varpr=var14;
else if condition="15" then varpr=var15;
else if condition="16" then varpr=var16;
else if condition="17" then varpr=var17;
else if condition="18" then varpr=var18;
else if condition="19" then varpr=var19;
else if condition="20" then varpr=var20;
run;
谢谢
您不能那样使用宏变量 - 它必须在数据步骤之外定义。
但是,如果我理解您的目的,您可以为此使用数组。
data want;
set have;
array var[20] var01-var20;
total=var[condition];
run;
一个不同的解决方案,不使用数组,使用 vvaluex 函数:
varpr = vvaluex(catt('var', condition));
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002233818.htm
在这里你可以创建一个带循环的小宏。
想法是
%宏观条件;
%do i=1 %to 20;
如果 condition="&i" 那么 out_var=in_&var;
%结束;
%修复;
在数据步骤中使用此宏。
希望能解决你的问题