La forma SAS de recorrer una tabla fuera de un paso de datos
Me pregunto cuál es la forma más limpia de cómo realizar un bucle macro sobre una tabla de datos fuera de un paso de datos para, por ejemplo, leer archivos de la tabla have
y hacer un análisis complejo para cada uno de los archivos.
Supongamos que tenemos una tabla que have
contiene un conjunto de nombres de archivos y otros metadatos:
N filename purpose
1 foo.xls Blue team data
2 bar.xls Read team data
Estaba pensando en 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;
¿Es así como se hace? Para mí, esta no parece la forma más sencilla.
Preguntas relacionadas:
- Bucle SAS a través de conjuntos de datos
- Declaración let de SAS: ¿se refiere a un valor de celda?
Respuestas
Entonces, si definió un nombre de macro ANALYSIS con los parámetros de entrada FILENAME y PURPOSE.
%macro analysis(filename,purpose);
/* Here comes the actual analysis */
title &purpose ;
proc import datafile="&filename" ....
%mend;
Luego, puede usar un paso de datos para generar una llamada a la macro para cada observación. Puede usar CALL EXECUTE, pero me resulta más claro y fácil de depurar simplemente escribir el código en un archivo y luego% INCLUDE. Especialmente cuando el nombre del parámetro coincide con el nombre de la variable en los metadatos que se utilizan para impulsar la generación de código.
Entonces este paso:
filename code temp;
data _null_;
set have;
file code;
put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;
Generará un programa como:
%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")
Que luego puedes ejecutar usando
%include code / source2;