循环变量和存储结果 SAS 的宏
Macro to loop through variables and store results SAS
我有以下变量:A_Bldg B_Bldg C_Bldg D_Bldg
。我想将它们乘以 INTSF
并将结果存储在一个新变量 Sale_i
中。例如,A_Bldg * INTSF = Sale_A
、B_Bldg * INTSF = Sale_B
等。
我的代码是:
%macro loopit(mylist);
%let n=%sysfunc(countw(&mylist));
%do J = 1 %to &n;
%let i = %scan(&mylist,&J);
data test;
set data;
sale_&i. = &i._Bldg * INTSF;
run;
%end;
%mend;
%let list = A B C D;
%loopit(&list);
这只会产生 Sale_D
,这是列表中的最后一个字母。如何让 Sales A-C
出现?前四行代码是为了循环遍历文本 A-D。我想过用数组来做,但不知道如何根据 A-D 指标选择变量。感谢您的帮助!
您当前正在遍历您的列表并每次都重新创建 test
数据集,因此它看起来只有 sale_d
因为您只查看了最后一次迭代。
您可以通过在一个数据步骤中扫描列表来解决您的问题,从而清理循环:
%let list = A B C D;
%macro loopit;
data test;
set data;
%do i = 1 %to %sysfunc(countw(&list.));
%let this_letter = %scan(&list., &i.);
sale_&this_letter. = &this_letter._Bldg * INTSF;
%end;
run;
%mend loopit;
%loopit;
您的 %DO
循环位置错误。但实际上,您不需要使用宏代码来执行本机 SAS 代码已经可以执行的操作。
data want;
set have ;
array in A_Bldg B_Bldg C_Bldg D_Bldg ;
array out sale_1-sale4 ;
do i=1 to dim(in);
out(i)=intsf*in(i);
end;
run;
我有以下变量:A_Bldg B_Bldg C_Bldg D_Bldg
。我想将它们乘以 INTSF
并将结果存储在一个新变量 Sale_i
中。例如,A_Bldg * INTSF = Sale_A
、B_Bldg * INTSF = Sale_B
等。
我的代码是:
%macro loopit(mylist);
%let n=%sysfunc(countw(&mylist));
%do J = 1 %to &n;
%let i = %scan(&mylist,&J);
data test;
set data;
sale_&i. = &i._Bldg * INTSF;
run;
%end;
%mend;
%let list = A B C D;
%loopit(&list);
这只会产生 Sale_D
,这是列表中的最后一个字母。如何让 Sales A-C
出现?前四行代码是为了循环遍历文本 A-D。我想过用数组来做,但不知道如何根据 A-D 指标选择变量。感谢您的帮助!
您当前正在遍历您的列表并每次都重新创建 test
数据集,因此它看起来只有 sale_d
因为您只查看了最后一次迭代。
您可以通过在一个数据步骤中扫描列表来解决您的问题,从而清理循环:
%let list = A B C D;
%macro loopit;
data test;
set data;
%do i = 1 %to %sysfunc(countw(&list.));
%let this_letter = %scan(&list., &i.);
sale_&this_letter. = &this_letter._Bldg * INTSF;
%end;
run;
%mend loopit;
%loopit;
您的 %DO
循环位置错误。但实际上,您不需要使用宏代码来执行本机 SAS 代码已经可以执行的操作。
data want;
set have ;
array in A_Bldg B_Bldg C_Bldg D_Bldg ;
array out sale_1-sale4 ;
do i=1 to dim(in);
out(i)=intsf*in(i);
end;
run;