我想在我的数据集中创建多个标志(以及许多派生的数字特征),但我很难让代码工作。
我正在使用带条件的迭代循环。任何有关决议的帮助或建议都将不胜感激。
这是我尝试过的代码,它创建了一个标志,但这不是我新数据集中的变量。
%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;
我感谢你能得到的任何帮助,在此先感谢。
答案 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;