A maneira do SAS de fazer um loop em uma tabela fora de uma etapa de dados
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 have
e fazer algumas análises complexas para cada um dos arquivos.
Suponha que temos uma tabela have
contendo 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 --- ¤t_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
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;