sas - 在 SAS 中从具有递增索引的宏变量创建变量
问题描述
我正在尝试从 SAS 宏中索引增加的宏变量创建变量,但我得到变量 aa_index 的缺失值,并且我得到 bb_index 的 0 值,这不应该是这种情况。请帮助我如何调整我的宏以正常工作。我的 SAS 宏如下所示;
%macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,);
/*create bb fields*/
%put bb_1 = &aa_&index - &aa_(&index+1);
%put bb_2 = &aa_(&index+1) - &aa_(&index+2);
%put bb_3 = &aa_(&index+2) - &aa_(&index+3);
/*create cc fields*/
cc_1 = max(bb_1,0);
cc_2 = max(bb_2,0);
cc_3 = max(bb_3,0);
%mend;
data ccc;
%cashflow_macro(index=1,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;
解决方案
主要将其从宏中取出并放入效率更高的数组中。
%macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,);
*create variable with index - 1 for other variables;
%let index1 = %eval(&index - 1);
*declare arrays;
array _aa (*) aa_1-aa_&index (
%do i=1 %to &index;
&&&aa_&i.
%end;
);
array _bb(*) bb_1 - bb_&index1;
array _cc(*) cc_1 - cc_&index1;
*calculations;
do i=1 to &index1;
_bb(i) = _aa(i) - _aa(i+1);
_cc(i) = max(_bb(i), 0);
end;
%mend;
data ccc;
%cashflow_macro(index=4,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;
还有一个可能更简化的版本:
%macro cashflow_macro_revised(series=);
*create variable with index - 1 for other variables;
%let index = %sysfunc(countw(&series));
%let index1 = %eval(&index - 1);
*declare arrays;
array _aa (*) aa_1-aa_&index (&series);
array _bb(*) bb_1 - bb_&index1;
array _cc(*) cc_1 - cc_&index1;
*calculations;
do i=1 to &index1;
_bb(i) = _aa(i) - _aa(i+1);
_cc(i) = max(_bb(i), 0);
end;
%mend;
data ccc;
%cashflow_macro_revised(series=400 300 250 270);
run;
如果您真的想坚持使用宏,这将起作用,但会产生一些警告。我没有时间调试除此之外,但它似乎工作。
%macro cashflow_macro(index=4,aa_1=,aa_2=,aa_3=,aa_4=,);
*create variable with index - 1 for other variables;
%let index1 = %eval(&index - 1);
%do i=1 %to &index1;
%let bb_&i = &&&aa_&i. - &&&aa_%eval(&i+1);
bb_&i = &&&bb_&i.;
cc_&i = max(&&&bb_&i, 0);
%end;
%mend;
data ccc1;
%cashflow_macro(index=4,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;
推荐阅读
- javascript - 标签等于特定文本时如何隐藏多个Div
- postgresql - 在 Hasura 中创建多对多关系
- html - 即使使用了 height 和 width 属性,图像也没有在 css 中调整大小
- css - 如何使用 CSS 2 将文本连续换行而没有空格?
- arrays - VBA 中的 Vlookup 等效项与 ARRAYS 中的 APROXIMATE MATCH
- paypal - NextJs 从 Paypal 获取交易响应
- c# - 如何使用两个可选路由值配置路由?
- javascript - 在 ReactJS 中,使用子组件后渲染中断
- android - 当两个依赖项使用FFmpeg时如何解决不满意的链接错误
- amazon-web-services - 使用 Amazon S3 SignedURL 从浏览器客户端 PUT 文件是否安全?