SAS宏代码变量创建

时间:2015-06-03 23:51:15

标签: variables macros sas creation

我想在我的数据集中创建多个标志(以及许多派生的数字特征),但我很难让代码工作。

我正在使用带条件的迭代循环。任何有关决议的帮助或建议都将不胜感激。

这是我尝试过的代码,它创建了一个标志,但这不是我新数据集中的变量。

%macro gb1(howmany);
   %do i=1 %to &howmany;
            %if status&i = 1 %then %let &gb1_&i = 1;
      %else %if status&i = 2 %then %let &gb1_&i = 1;
      %else %if dpd&i >= 2   %then %let &gb1_&i = 1;
      %else %if ((dpd&i < 2) and (dpd&i >= 1)) %then %let &gb1_&i = 2;
      %else %let &gb1_&i = 1;    
   %end;    
%mend gb1;

data test;
   set y2014.perf_data_derive (where=((dpd15 <= 2) and (prod = 1)));;
   %gb1(36);
run;

我感谢你能得到的任何帮助,在此先感谢。

2 个答案:

答案 0 :(得分:1)

%if%then%else等是宏语句,用于使用宏变量计算表达式,以便有条件地提交SAS代码片段。你似乎并没有尝试做任何这样的事情;您只想重复涉及数据集中变量的数据步骤语句(而不是宏变量)。为此,请使用与数据步骤中相同的语句:

%macro gb1(howmany);

%do i=1 %to &howmany;

if status&i = 1 then gb1_&i = 1;
else if status&i = 2 then gb1_&i = 1;
else if dpd&i >= 2 then gb1_&i = 1;
else if ((dpd&i < 2) and (dpd&i >= 1)) then gb1_&i = 2;
else let gb1_&i = 1;

%end;

%mend gb1;

答案 1 :(得分:1)

我认为你对宏语言感到困惑。它(通常)用于生成SAS代码。基本上,它可以帮助您免于输入。它对DATA步变量没有任何作用。 DATA步骤代码允许您操作数据步骤变量,宏语言处理宏变量。

您的输入数据集perf_data_derive是否包含status1 status2 ... status36和dpd1 dpd2 ... dpd36等变量?而你正在尝试创建新变量gb1_1 gb1_2 ... gb1_36?如果是这样,您应该研究如何使用数组。 ARRAY语句是一个DATA步骤语句,可用于引用数据步骤变量。您可以将其编码为(未经测试):

data test;
  set y2014.perf_data_derive (where=((dpd15 <= 2) and (prod = 1)));
  array status{36} ; *array elements status1-status36;
  array dpd{36} ;
  array gb1_{36} ; *array statement can create new variables! ;
  do i=1 to 36;
    if status{i}=1 then gb1_{i} = 1;
    else if status{i}=2 then gb1_{i} = 1;
    else if dpd{i} >=2 then gb1_{i} = 1;
    *etc;
  end;
  drop i;
run;