我有这样的数据集;
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;
感谢您的帮助。
答案 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;