宏变量中的简单计算 - 使用 MOD(,) 函数的任何方式?

Simple calculations in Macro Variables - any way to use the MOD(,) function?

在定义宏变量时,有没有巧妙的方法来使用MOD(,)函数?

例如考虑这个:

%LET year=2015;
%LET dec = %EVAL(mod(&year.,100));

其中 dec 将只包含年份的最后两位数字。这将不起作用(与 SYSEVAL 相同),因为 %EVAL 函数无法正确访问 MOD 函数。

我不想包含 DATA STEP,但结果实际上应该是这样的:

data _null_;
input_year=2015;
input_dec =mod(input_year,100);
%LET year=input_year;
%LET dec = input_dec;
put &dec. 'and ' &year.;
run;

这里的问题是无法在 DATA STEP 之外调用宏变量(也许我做错了什么?甚至 global option 也不能解决问题)。

一些上下文:

在现有的 autoexec file 中,用户必须根据年份更改一些输入,总共需要调整 3 个宏变量(年份、十二月和后续年份)。我的想法是仅从一个输入(年份)推断出其他变化。

%eval%sysevalf 用于在数据步骤之外对数字进行计算。使用函数时,您需要 %sysfunc

%LET year=2015;
%LET dec = %sysfunc(mod(&year.,100));

%put &=dec. and &=year.;

您需要使用 SYSFUNC() 才能在宏语法中使用函数。 SUBSTR 也可以工作。

%let year=2015;
%let index = %sysfunc(substr(&year, 3, 2));

%put &year;
%put &index.;

%EVAL() 适用于数学计算,例如:

%let next_year = %eval(&year + 1);
%let next_year_index = %eval(&index + 1);

%put Next Year: &next_year.;
%put Next Year Index: &next_year_index;

Reeza 提供了一个很好的解决方案,绝对正确。我将通过两条评论对其进行扩展:
1. 您可以在 SAS 中找到类似 %SUBSTR 的函数,但这些函数仅在 macrovariables 上运行;相反,它们不会取代 %sysfunc(substr())
2. 花一点时间浏览一下宏函数列表很有用,即那些以百分号开头的函数:您会看到除了 %EVAL() 之外,还有 %SYSEVALF()。该列表是 here.