Variables SAS宏代码变量创建

Variables SAS宏代码变量创建,variables,macros,sas,creation,Variables,Macros,Sas,Creation,我想在我的数据集中创建多个标志(以及许多派生的数字特征),但我很难让代码正常工作 我使用的是带条件的迭代循环。如对决议有任何帮助或建议,将不胜感激 这是我尝试过的代码,它创建了一个标志,但这在我的新数据集中不是一个变量 %macro gb1(howmany); %do i=1 %to &howmany; %if status&i = 1 %then %let &gb1_&i = 1; %else %if status&am

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

我使用的是带条件的迭代循环。如对决议有任何帮助或建议,将不胜感激

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

%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;
%宏gb1(有多少个);
%i=1%到多少;
%如果状态&i=1%,则%let&gb1\i=1;
%如果状态&i=2%,则为%let&gb1\i=1;
%如果dpd&i>=2%,则%let&gb1\uI=1;
%如果((dpd&i<2)和(dpd&i>=1))%,则%let&gb1\u&i=2;
%其他%let&gb1_&i=1;
%结束;
%修复gb1;
数据测试;

设置y2014.perf_data_派生(其中=((dpd15
%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;
%宏gb1(有多少个);
%i=1%到多少;
如果状态&i=1,则gb1\i=1;
否则,如果状态&i=2,则gb1\i=1;
否则,如果dpd&i>=2,则gb1_&i=1;
否则,如果((dpd&i<2)和(dpd&i>=1)),则gb1_&i=2;
否则,让gb1_&i=1;
%结束;
%修复gb1;

我认为您对宏语言感到困惑。它(通常)用于生成SAS代码。基本上,它可以避免您键入。它不处理数据步骤变量。数据步骤代码允许您操作数据步骤变量,宏语言处理宏变量

您的输入数据集perf_data_derive是否具有status1 status2…status36和dpd1 dpd2…dpd36之类的变量?并且您正在尝试创建新变量gb1_1 gb1_2…gb1_36?如果是,您应该研究如何使用数组。ARRAY语句是一个数据步骤语句,允许您引用数据步骤变量。您可以对其进行编码类似(未经测试):

数据测试;
设置y2014.perf_data_派生(其中=((dpd15=2,然后gb1_{i}=1;
*等等,;
结束;
第一滴;
跑

我同意。这是完成这项任务的最佳方式。
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;