데이터 단계 외부에서 테이블을 반복하는 SAS 방식

Dec 02 2020

예를 들어 테이블에서 파일을 읽고 각 파일에 대해 복잡한 분석을 수행 하기 위해 데이터 단계 외부 의 데이터 테이블에 대해 매크로 루프를 수행하는 가장 깨끗한 방법이 무엇인지 궁금 have합니다.

have파일 이름 및 기타 메타 데이터 세트가 포함 된 테이블이 있다고 가정 합니다.

N  filename  purpose
1  foo.xls   Blue team data
2  bar.xls   Read team data

나는 뭔가를 생각하고 있었다

%local lines current_file current_purpose;

proc sql noprint;
   select count(*) into: lines from have;
quit;

%do I=1 %to &lines.;
   %put --- Process file number &I. ---;
   data _null_;
      set have;
      if _n_=&I. then do;
        call symput('current_file',filename);
        call symput('current_purpose',purpose);
      end;
   run;
   %put --- &current_file. contains &purpose.;
   /* Here comes the actual analysis */ 
%end;

이것이 방법입니까? 나에게 이것은 가장 간단한 방법처럼 보이지 않습니다.

관련 질문 :

  • 데이터 세트를 통한 SAS 루프
  • SAS let 문 : 셀 값 참조?

답변

3 Tom Dec 02 2020 at 20:46

따라서 입력 매개 변수 FILENAME 및 PURPOSE를 사용하여 매크로 이름 ANALYSIS를 정의한 경우.

%macro analysis(filename,purpose);
  /* Here comes the actual analysis */ 
  title &purpose ;
  proc import datafile="&filename" ....
%mend;

그런 다음 데이터 단계를 사용하여 각 관측치에 대해 매크로에 대한 하나의 호출을 생성 할 수 있습니다. CALL EXECUTE를 사용할 수 있지만 코드를 파일에 작성한 다음 % INCLUDE하는 것만으로 디버그하는 것이 더 명확하고 더 쉽습니다. 특히 매개 변수 이름이 코드 생성을 구동하는 데 사용되는 메타 데이터의 변수 이름과 일치 할 때.

그래서이 단계 :

filename code temp;
data _null_;
   set have;
   file code;
   put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;

다음과 같은 프로그램을 생성합니다.

%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")

다음을 사용하여 실행할 수 있습니다.

%include code / source2;