2016-09-20 93 views
1

我有一个数据集是这样;如何使用算术运算符与SAS宏变量

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; 

感谢您的帮助。

回答

1

我不完全确定你想达到什么,所以我只能回答你关于宏变量操作的问题,为了让你的示例工作,你应该把它放在一个单独的宏,然后你可以做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; 
+0

这正是我所期待的。感谢您的帮助 – kutayatesoglu

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; 
+0

我硬编码一个上限的唯一原因是因为我更新了其他一些我以前做过的代码,并且要求改变。你是对的,两个上限都是一样的,所以我会把它们引用到宏变量中。 你的代码也很好地工作谢谢你展示另一种方式来做到这一点。 – kutayatesoglu