BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
opuyfb91
Fluorite | Level 6

안녕하세요, SAS 초보로 요새 매크로 부분을 공부 중인 사람입니다.

 

아래와 같이 코드를 짰는데요

 

%MACRO BINNING();

DATA _NULL_;

SET TMP;

ARRAY VAR {*} _ALL_;

CALL SYMPUT('N', DIM(VAR));

%DO I = 1 %TO &N;

CALL SYMPUT('VN', VNAME(VAR{&I}));

CALL EXECUTE('PROC RANK DATA = TMP(KEEP = &VN) OUT = &VN._BIN GROUPS = 5 TIES = DENSE;' || 'VAR &VN;' || 'RUN;' );

%END;

RUN;

%MEND BINNING;

%BINNING();

 

원 데이터 TMP에서 변수를 하나씩 꺼내 PROC RANK를 이용해 구간을 자르려는게 제 의도인데요!

 

매크로를 실행시키면 의도한 대로 각변수가 구간이 잘려지고 관련된 데이터 셋들이 형성은 되는데...

 

루프가 안멈춘다고 해야할지 매크로가 안멈춘다고 해야할지... 

 

PROC RANK를 실행하는 과정이 끊임없이 반복되어 제가 강제적으로 종료를 시켜야하더라고요.

 

N을 통해서 DO LOOP의 끝을 지정해줬다고 생각하는데...

 

왜 끊임 없이 돌아가는지 아시는 분 계시는지요 ㅠ

 

 

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
Chulgyu1
SAS Employee

아래 문장을 실행한 후에 코드를 실행하여 LOG에 나오는 프로그램 확인해 보세요.

OPTIONS MPRINT; 

 

데이터 스텝에서 매크로 변수 생성하면서 동일한 스텝에서 생성된 매크로 변수는 사용하지 않아야 합니다.

이 부분만 주의해서 사용하시면 될 듯 합니다.

 

다음 코드를 사용하시면 원하시는 결과가 나옵니다.

%MACRO BINNING();

DATA _NULL_;
SET TMP;
ARRAY VAR {*} _ALL_;
CALL SYMPUT('N', DIM(VAR));
DO I = 1 TO DIM(VAR);
CALL SYMPUT('VN'||left(put(I,4.)), VNAME(VAR{I}));
END;

RUN;

%put &=n;
%put &=vn1;

%DO I = 1 %TO &N;
PROC RANK DATA = TMP(KEEP = &&VN&I) OUT = &&VN&I.._BIN GROUPS = 5 TIES = DENSE; VAR &&VN&I; RUN;
%END;

%MEND BINNING;

%BINNING();

View solution in original post

1 REPLY 1
Chulgyu1
SAS Employee

아래 문장을 실행한 후에 코드를 실행하여 LOG에 나오는 프로그램 확인해 보세요.

OPTIONS MPRINT; 

 

데이터 스텝에서 매크로 변수 생성하면서 동일한 스텝에서 생성된 매크로 변수는 사용하지 않아야 합니다.

이 부분만 주의해서 사용하시면 될 듯 합니다.

 

다음 코드를 사용하시면 원하시는 결과가 나옵니다.

%MACRO BINNING();

DATA _NULL_;
SET TMP;
ARRAY VAR {*} _ALL_;
CALL SYMPUT('N', DIM(VAR));
DO I = 1 TO DIM(VAR);
CALL SYMPUT('VN'||left(put(I,4.)), VNAME(VAR{I}));
END;

RUN;

%put &=n;
%put &=vn1;

%DO I = 1 %TO &N;
PROC RANK DATA = TMP(KEEP = &&VN&I) OUT = &&VN&I.._BIN GROUPS = 5 TIES = DENSE; VAR &&VN&I; RUN;
%END;

%MEND BINNING;

%BINNING();

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 1 reply
  • 907 views
  • 2 likes
  • 2 in conversation