La manière SAS de boucler sur une table en dehors d'une étape de données
Je me demande quelle est la manière la plus propre d'effectuer une macro boucle sur une table de données en dehors d' une étape de données afin, par exemple, de lire des fichiers de la table have
et de faire une analyse complexe pour chacun des fichiers.
Supposons que nous ayons une table have
contenant un ensemble de noms de fichiers et d'autres métadonnées:
N filename purpose
1 foo.xls Blue team data
2 bar.xls Read team data
Je pensais à quelque chose comme
%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;
Est-ce la manière de procéder? Pour moi, cela ne ressemble pas à la manière la plus simple.
Questions connexes:
- Boucle SAS à travers les ensembles de données
- Instruction SAS let: faire référence à une valeur de cellule?
Réponses
Donc, si vous avez défini un nom de macro ANALYSIS avec les paramètres d'entrée FILENAME et PURPOSE.
%macro analysis(filename,purpose);
/* Here comes the actual analysis */
title &purpose ;
proc import datafile="&filename" ....
%mend;
Ensuite, vous pouvez utiliser une étape de données pour générer un appel à la macro pour chaque observation. Vous pouvez utiliser CALL EXECUTE, mais je trouve plus clair et plus facile à déboguer d'écrire simplement le code dans un fichier, puis de le% INCLURE. Surtout lorsque le nom du paramètre correspond au nom de la variable dans les métadonnées utilisées pour piloter la génération de code.
Donc cette étape:
filename code temp;
data _null_;
set have;
file code;
put '%analysis(' filename= ',' purpose= :$quote. ')' ;
run;
Générera un programme comme:
%analysis(filename=foo.xls,purpose="Blue team data")
%analysis(filename=bar.xls,purpose="Red team data")
Que vous pouvez ensuite exécuter en utilisant
%include code / source2;