宏 Do 循环在 RSUBMIT 中无法正常工作

Macro Do loop not working properly in RSUBMIT

所以我有这段代码可以正常工作一年,但我需要将它转换为一个循环,以便它可以在 1970 年到 2015 年之间工作。

这是我在 %let 语句中指定的 1 年代码。

%let year=1970
rsubmit; 
data home.historical_returns_&year;
set home.crspdata;
where (year <= &year - 1) and (year >= &year - 5);
returns_count + 1;
by id year;
if first.id or missing(tot_ret) then returns_count = 1;
run;
endrsubmit;

到目前为止,该代码对我来说效果很好。现在,我正在尝试使用一个循环,所以我在 1970 年到 2015 年都这样做了。

我想到了这个。看起来效果很好,但年份停留在 1970 年。

%macro GMV;
rsubmit;
%do year=1970 %to 2015;
data home.historical_returns_&year;
set home.crspdata;
where (year <= &year - 1) and (year >= &year - 5);
returns_count + 1;
by id year;
if first.id or missing(tot_ret) then returns_count = 1;
run;
%end;
endrsubmit;

%mend GMV;

%GMV

在日志中,我看到名称中的 &year 从 1970 到 1971 到 1972 等等实际上从未改变过。所以我最终没有得到我需要的 45 个不同的数据集。

有人遇到过这个问题吗?

谢谢!

您将远程处理与本地处理混为一谈,这会导致此类问题。你的宏变量不会更新(我有点惊讶它没有抛出关于 %do 循环的错误,就个人而言)。

rsubmit;

%macro GMV;
%do year=1970 %to 2015;
data home.historical_returns_&year;
set home.crspdata;
where (year <= &year - 1) and (year >= &year - 5);
returns_count + 1;
by id year;
if first.id or missing(tot_ret) then returns_count = 1;
run;
%end;

%mend GMV;

%GMV
endrsubmit;

将整个宏放入 rsubmit 以获得您要查找的结果 - 或者将整个 rsubmit 放入宏(我认为这不是一个好主意,尽管汤姆在评论中指出它可能是在某些情况下是更安全的选择)。

如果您想在代码中引用宏变量,RSUBMIT 则该宏变量需要存在于远程会话中。

%macro GMV(start,end);
   %local year;
   %do year=&start %to &end;
      %syslput year=&year;
      rsubmit;
       data home.historical_returns_&year;
         set home.crspdata;
         by id year;
         where (year <= &year - 1) and (year >= &year - 5);
         returns_count + 1;
         if first.id or missing(tot_ret) then returns_count = 1;
       run;
     endrsubmit;
   %end;
 %mend GMV;

 %GMV(1970,2015);