Cara SAS untuk mengulang tabel di luar langkah data

Dec 02 2020

Saya bertanya-tanya apa cara terbersih bagaimana melakukan perulangan makro di atas tabel data di luar langkah data untuk misalnya membaca dalam file dari tabel havedan melakukan beberapa analisis kompleks untuk masing-masing file.

Asumsikan kita memiliki tabel yang haveberisi sekumpulan nama file dan data meta lainnya:

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

Saya sedang memikirkan sesuatu seperti

%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;

Apakah ini cara melakukannya? Bagi saya, ini bukan cara yang paling sederhana.

Pertanyaan-pertanyaan Terkait:

  • SAS melalui kumpulan data
  • Pernyataan SAS let: mengacu pada nilai sel?

Jawaban

3 Tom Dec 02 2020 at 20:46

Jadi jika Anda mendefinisikan sebuah nama makro ANALISIS dengan parameter masukan NAMA FILE dan TUJUAN.

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

Kemudian Anda dapat menggunakan langkah data untuk menghasilkan satu panggilan ke makro untuk setiap observasi. Anda dapat menggunakan CALL EXECUTE, tetapi saya merasa lebih jelas dan lebih mudah untuk melakukan debug dengan hanya menulis kode ke file dan kemudian% TERMASUK. Terutama ketika nama parameter cocok dengan nama variabel di metadata yang digunakan untuk mendorong pembuatan kode.

Jadi langkah ini:

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

Akan menghasilkan program seperti:

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

Yang kemudian dapat Anda jalankan menggunakan

%include code / source2;