A maneira do SAS de fazer um loop em uma tabela fora de uma etapa de dados

Dec 02 2020

Estou me perguntando qual é a maneira mais limpa de executar um loop de macro em uma tabela de dados fora de uma etapa de dados para, por exemplo, ler arquivos da tabela havee fazer algumas análises complexas para cada um dos arquivos.

Suponha que temos uma tabela havecontendo um conjunto de nomes de arquivo e outros metadados:

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

Eu estava pensando em algo como

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

É assim que se faz? Para mim, essa não parece a maneira mais simples.

Perguntas relacionadas:

  • SAS loop através de conjuntos de dados
  • Declaração SAS let: referir-se a um valor de célula?

Respostas

3 Tom Dec 02 2020 at 20:46

Portanto, se você definiu um nome de macro ANALYSIS com os parâmetros de entrada FILENAME e PURPOSE.

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

Em seguida, você pode usar uma etapa de dados para gerar uma chamada para a macro para cada observação. Você pode usar CALL EXECUTE, mas acho mais claro e mais fácil depurar apenas escrever o código em um arquivo e, em seguida,% INCLUDE-lo. Especialmente quando o nome do parâmetro corresponde ao nome da variável nos metadados que estão sendo usados ​​para conduzir a geração do código.

Portanto, esta etapa:

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

Irá gerar um programa como:

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

Que você pode executar usando

%include code / source2;