如何将算术运算符与SAS宏变量一起使用

时间:2016-09-20 10:54:25

标签: 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 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;

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我不确定你想要实现什么,所以我只能回答你关于宏变量操作的问题,让你的样本工作你应该把它放在一个单独的宏中,然后你就可以做eval函数了你的macrovariable添加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;

答案 1 :(得分:0)

除了定义可变列表的上限之外,您不需要使用宏变量。

使用普通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;