如何对 SAS 宏变量使用算术运算符

How to use arithmetic operators with SAS macro variables

我有这样的数据集;

DATA work.faminc;
    INPUT famid faminc1-faminc12 ;
CARDS;
1 3281 3413 3114 2500 2700 3500 3114 3319 3514 1282 2434 2818
2 4042 3084 3108 3150 3800 3100 1531 2914 3819 4124 4274 4471
3 6015 6123 6113 6100 6100 6200 6186 6132 3123 4231 6039 6215
;
RUN;

我可以创建一个变量并用它做一些事情,比如,

%let N=12;

DATA faminc1b;
   SET faminc ;

   ARRAY Afaminc(12) faminc1-faminc12 ;
   ARRAY Ataxinc(&N) taxinc1-taxinc&N ;
   DO month = 1 TO &N;
     Ataxinc(month) = Afaminc(month) * .10 ;
   END;
RUN;

但是我也想把每个家庭的收入都分给之前的

结果应该像 faminc1/faminc2 - faminc2/faminc3 - faminc3/faminc4...

所以主要问题是如何对我创建的 "N" 变量使用算术 (+,-,*,/) 运算符。

当我尝试简单地执行此操作时,它不起作用;

%let N=12;

DATA faminc1b;
   SET faminc ;

   ARRAY Afaminc(12) faminc1-faminc12 ;
   ARRAY Afamdiv(&N) famdiv1-famdiv&N ;
   DO month = 1 TO &N+1;
     Afamdiv(month) = faminc&N/faminc&N+1 ;
   END;
RUN;

感谢您的帮助。

我不太确定你想要实现什么,所以我只能回答你关于宏变量操作的问题,为了让你的示例工作,你应该把它放在一个单独的宏中,然后你可以做 eval在您的宏变量上添加 1 的函数。

但据我所知,你必须使用月份作为循环变量而不是 N,而且你必须在 11 处停止,因为你没有变量 13 可以除以变量 12。

%let N=12;
%macro calc;
DATA faminc1b;
   SET faminc ;

   ARRAY Afaminc(12) faminc1-faminc12 ;
   ARRAY Afamdiv(&N) famdiv1-famdiv&N ;
   %DO month = 1 %TO %eval(&N-1);
     Afamdiv(&month) = faminc&month/faminc%eval(&month+1) ;
   %END;
RUN;
%mend;
%calc;

除了定义变量列表的上限之外,您不需要将宏变量用于任何其他用途。

您可以使用普通 SAS 代码执行的所有其他操作。使用 DIM() 函数查找上界数组。在计算中使用数组。不确定为什么要对一个上限进行硬编码并为另一个上限使用宏变量,但是如果它们可能不同,那么您需要考虑两个数组的长度以找到 DO 循环的上限。

%let N=12;

DATA faminc1b;
   SET faminc ;
   ARRAY Afaminc faminc1-faminc12 ;
   ARRAY Afamdiv famdiv1-famdiv&N ;
   DO month = 1 TO min(dim(afaminc)-1,dim(afamdiv));
     Afamdiv(month) = afaminc(month)/afaminc(month+1) ;
   END;
RUN;