2016-08-25 6 views
0

SAS로 작업 중이므로 DO 루프 내에서 일부 매크로 변수를 만들어야합니다. 이것은 내 코드의 일부입니다 : 또 다른 i=1 to &end에서 실행 DO 루프 내부에SAS에서 && 매크로 변수를 사용하는 방법

%if &dsempty888=0 %then %do; 
    data _null_; 
    set freq_&&var&i; 
     if &&var&i=888888888 then do; 
      call symput("cont8_&&var&i",percent); 
     end; 
    run; 
%end; 
%if &dsempty888=1 %then %do; 
    %let cont8_&&var&i=0; 
%end; 

%if &dsempty999=0 %then %do; 
    data _null_; 
    set freq_&&var&i; 
     if &&var&i=999999999 then do; 
      call symput("cont9_&&var&i",percent); 
     end; 
    run; 
%end; 
%if &dsempty999=1 %then %do; 
    %let cont9_&&var&i=0; 
%end; 


%if &dsempty444=0 %then %do; 
    data _null_; 
    set freq_&&var&i; 
     if &&var&i=444444444 then do; 
      call symput("cont4_&&var&i",percent); 
     end; 
    run; 
%end; 
%if &dsempty444=1 %then %do; 
    %let cont4_&&var&i=0; 
%end; 

이 코드입니다. 내 매크로 변수 cont4_&&var&icont8_&&var&icont9_&&var&i은 값 비싼 과대 평가를받으며 루프 외부에서 유용하지 않게됩니다. 나는 그들에게 예를 들어 &&cont4_&&var&i이라고 이름을 붙이려고했다. 그러나 분명히 SAS는 매크로를 해결하지 못합니다. 실제로 루프 내부에서 매크로가 만들어 지지만 외부에 필요할 때 매크로를 호출하는 방법을 모르겠습니다.

어떻게 수정할 수 있습니까?

미리 감사드립니다.

+0

는 또한 [이 질문] 참조 (http://stackoverflow.com/questions/24895197/resolving-multiple-ampersands-를 with-macro-variables) 및 [이 질문] (http://stackoverflow.com/questions/22903856/sas-macro-ampersand/22915555#22915555)에서 여러 앰퍼샌드 해결 방법에 대한 자세한 내용을 참조하십시오. – Joe

답변

4

여기에 많은 문제가 있으므로 여기를 간단하게 해 보겠습니다. 다음은 매우 간단한 예제입니다. 이것은, 예를 들어, 일을 수행합니다

%let var1 = age; 
%let var2 = height; 
%let var3 = weight; 

proc freq data=sashelp.class noprint; 
    tables age/out=freq_age; 
    tables height/out=freq_height; 
    tables weight/out=freq_weight; 
run; 


%macro get_freqs(var_count=); 
    %do i = 1 %to &var_count.; 
     data _null_; 
     set freq_&&var&i; 
     call symput("cont4_&&var&i",percent); 
     run; 
    %end; 
%mend get_freqs; 

%get_Freqs(var_count=3) 

하지만 지금 우리는 물론

%put cont4_&&var&i; 

을 할 경우 &i는 아무런 의미가 없기 때문에 그것은 작동하지 않습니다. 그래서 대신 우리는 이것을 1로 대체합니다 :

%put cont4_&&var1; 

이제 우리는 뭔가를 얻습니다. 그러나 우리는 아무것도 유용하지 않습니다. 변수 이름 일뿐입니다. 그러나 적어도 그것은 뭔가입니다!

이제 우리는 두 번째로 &이 필요하지 않습니다. 맞습니까?

%put cont4_&var1; 

는 그러나 우리는 매크로 변수를 사용하려면이 전에 &이 필요합니다

%put &cont4_&var1; 

을하지만 지금 우리는 경고 메시지, CONT4_ not resolved를 얻을. 자, &var1이 해결 될 때까지 매크로 변수의 해상도를 지연 시키려면 두 번째 &을 추가합시다.

%put &cont4_&var1; 

글쎄, 지금은 CONT4_AGE not resolved라고합니다. 왜 안돼? 우리는 이것을 정의하기 위해 call symput을 사용했습니다. 맞습니까?

문제는 범위가입니다. call symput은 아마 로컬로 범위를 지정했기 때문에 매크로에 정의되었지만 매크로 외부에 정의되지는 않았습니다. 이를 위해 call symputx을 사용하고 전역 범위를 지정합니다.

%macro get_freqs(var_count=); 
    %do i = 1 %to &var_count.; 
     data _null_; 
     set freq_&&var&i; 
     call symputx("cont4_&&var&i",percent,'g'); 
     run; 
    %end; 
%mend get_freqs; 

내가 &cont4_age 매크로의 외부에서 정의 할 수 원하는 SAS를 알려줍니다. 그렇지 않으면 매크로 내부에서만 사용할 수 있으며 정리됩니다.

%put &&cont4_&var1; 

을하지만 이상 &i 다시 반복하기를 원한다면, 그것은 비트 더 복잡 :

지금이 작동합니다.이러한 앰퍼샌드를 여러 번 지연해야하고 여러 번 통과해야하기 때문입니다.

여기에 작동하는 내용은 다음과 같습니다

%macro iterate_i(var_count=); 
    %do i = 1 %to &var_count.; 
    %put &&&&cont4_&&var&i.; 
    %end; 
%mend iterate_i; 

%iterate_i(var_count=3); 

우리는 왜 &의 필요합니까? 음, &&cont4_&var1으로 가야합니다. 맞습니까? 그것은 첫 번째 패스에서 발생합니다. 여기에 세 패스는 다음과 같습니다

&&&&cont4_&&var&i ->&&cont4_&var1 ->&cont4_age -> 5.26 ...

각 패스는 다음과 같은 상황이 발생합니다

  • &&

    ->& (그리고 다음 패스 저장)
  • & -> 해결 매크로 변수

그래서, 그것들을 반복하는 방법입니다. 당신은 물론 명시 적 수준에서 매크로 변수를 지정할 수 있습니다 - 그래서 이러한 모든 작업 :

%let i=1; 
%put &&&&cont4_&&var&i; 
%put &&cont4_&var1; 
%put &cont4_age; 
관련 문제