所以我创建了一个非常好的宏。在宏观中,我设置观察将开始读取的位置,然后设置它将读取多少观察值。
但是,在我的proc打印电话中,我无法简单地做到:
(firstobs=&start obs=&obs)
因为虽然firstobs会在我想要的地方正确启动,但是obs不合作,因为它必须比firstobs更高的数字。例如,
%testmacro(start=5, obs=3)
不起作用,因为它正在阅读前3个观察结果,但试图从观察开始5.我想要宏做的是,从观察5开始,然后阅读下一个3.所以我做了什么是这样的:
(firstobs=&start obs=%eval((&obs-1)+&start))
当我使用它时,这完全正常。但我只是想知道是否有更简单的方法来做到这一点,而不是必须使用整个%eval ...调用。有没有一个简单的电话,比如numberofobservations = ......?
答案 0 :(得分:3)
我认为没有。你只能在%eval()内稍微简化你的宏。
%let start=5;
%let obs=3;
data want;
set sashelp.class (firstobs=&start obs=%eval(&obs-1+&start));
run;
您可以使用计数器对数据步骤中的数据进行计数,并仅输出所需的记录,但这对于proc打印不起作用,对于较大的数据步骤效率不高。
您可以尝试使用point =选项,但我不熟悉该方法,而且我认为它不适用于proc print。
答案 1 :(得分:1)
正如@Reeza所说 - 没有一个数据集选项能够满足您的需求。不幸的是,你需要计算结束观察结果,%eval()
和其他任何方法一样好。
另外,我建议您的宏参数更灵活。而不是这个:
%testmacro(start=5, obs=3)
将其更改为采用单个参数,该参数将是要应用的数据集选项列表:
%macro testmacro(iDsOptions);
data want;
set sashelp.class (&iDsOptions);
run;
%mend;
%testmacro(firstobs=3 obs=7);
如果您以后需要添加其他选项,这将提供更大的灵活性,这意味着更少的未来代码更改,并且调用宏更简单。你也推迟将这种情况下的观察计数计算到调用程序,这是一件好事。