2016-09-20 3 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 -은 "N"에 연산자 (+, -, *, /) faminc3/faminc4 ...

그래서 큰 문제는 연산을 사용하는 방법입니다 내가 만든 변수.

간단히 해 보았을 때 작동하지 않았습니다.

%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

저는 여러분이 달성하고자하는 것이 정확히 무엇인지 모르겠으므로 macrovariable에서의 작업에 관한 질문에만 답변 할 수 있습니다. 샘플을 작동 시키려면 별도의 매크로에 넣어야합니다. 그런 다음 eval 함수를 사용할 수 있습니다. 귀하의 macrovariable에 1을 추가 할 수 있습니다. 12 변수로 나누기 위해 변수 13이 없기 때문에 내가 볼 수있는 한, 당신은 loopingvariable과 N이 아닌, 또한 11에서 멈추어야 만합니다. .

%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

내가 다른 코드를 업데이트하고 변경하기 위해 forgat를 변경하기 때문에 하나의 upperbound를 하드 코드하는 유일한 이유가 있습니다. 당신은 모두 상한이 항상 같아서 매크로 변수를 참조 할 것입니다. 코드 또한 잘 작동합니다. 다른 방법으로 보여 주셔서 감사합니다. – kutayatesoglu