宏 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);
所以我有这段代码可以正常工作一年,但我需要将它转换为一个循环,以便它可以在 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);