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

如何对SAS宏变量使用算术运算符,sas,sas-macro,Sas,Sas Macro,我有一个这样的数据集 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 603

我有一个这样的数据集

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

但就我所见,你必须用month作为循环变量,而不是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;

这正是我想要的。谢谢你的帮助我之所以硬编码一个上界的唯一原因是因为我更新了一些以前做过的代码,并且放弃了更改。你们是对的,这两个上限一直都是相同的,所以我要把它们引用到宏变量中。你的代码也很好用,谢谢你展示了另一种方法。