2

マクロを繰り返したい169の町があります。(タウンコードではなく)タウン名を使用して出力ファイルを保存する必要があります。TOWNタウンコードとタウン名のデータセット( )があります。%leti = town-codeである反復ごとにtown-nameに設定されるステートメント を持つことは可能ですか?

index関数を使用して町の名前を一覧表示できることは知っていますが、%leti=TOWN.town-codeのときにステートメントがTOWN.town-nameに設定されるようにindex関数を設定する方法が必要です。


以下のすべての答えは可能のようです。今のところ、%let =%scan(、&i)オプションを使用しています。制限は、町の名前が複数の単語になる可能性があることです。そのため、後で修正するスペースをアンダースコアに置き換えました。

これは私のマクロです。169の町のそれぞれに優れたprocレポートを出力します。町の名前としてExcelファイルを保存し、ヘッダーに町の名前を含める必要があります。次に、Excelで、169個のワークシートすべてを1つのブックにマージします。

%MACRO BY_YEAR;

    %let townname=Andover Ansonia Ashford Avon ... Woodbury Woodstock;

    %do i = 1999 %to 2006;

    %do j = 1 %to 169;

    %let name = %scan(&townname,&j); 

    ods tagsets.msoffice2k file="&ASR.\Town_Annual\&i.\&name..xls" style=minimal;


    proc report data=ASR nofs nowd split='/';
    where YR=&i and TWNRES=&j;
      column CODNUM AGENUM  SEX,(dths_sum asr_sum seasr_sum);
      define CODNUM / group     ;
      define agenum / group     ;
      define sex / across ;
      define dths_sum / analysis ;
      define asr_sum / analysis ;
      define seasr_sum / analysis ;
      break after CODNUM / ul;
      TITLE1 "&name Resident Age-Specific Mortality Rates by Sex, &i";
      TITLE2 "per 100,000 population for selected causes of death";
    run;

    ods html close;

    %end;

    %end;

%MEND;
4

2 に答える 2

2

私の推測では、町のインデックスで町名を検索する理由は、町名ごとにマクロを繰り返し呼び出すためです。これがあれば、タウンインデックス事業に携わる必要もありません。各町名でマクロを呼び出すだけです。これを行うには多くの方法があります。を使用する 1 つの方法を次に示しcall execute()ます。

data towns;
  infile cards dlm=",";
  input town :$char10. @@;
cards;
My Town,Your Town,His Town,Her Town
;
run;

%macro doTown(town=);
  %put Town is &town..;
%mend doTown;

/* call the macro for each town */
data _null_;
  set towns;
  m = catx(town, '%doTown(town=', ')');
  call execute(m);
run;

/* on log
Town is My Town.
Town is Your Town.
Town is His Town.
Town is Her Town.
*/

テーブル ルックアップを行う必要がある場合、1 つの方法は、町の名前を数値形式に変換し、インデックス値を指定して名前を取得する単純なマクロを作成することです。何かのようなもの:

data towns;
  infile cards dlm=",";
  input town :$char10. @@;
cards;
My Town,Your Town,His Town,Her Town
;
run;

/* make a numeric format */
data townfmt;
  set towns end=end;
  start = _n_;
  rename town = label;
  retain fmtname 'townfmt' type 'n';
run;
proc format cntlin=townfmt;
run; 

%macro town(index);
  %trim(%sysfunc(putn(&index,townfmt)))
%mend town;

%*-- check --*;
%put %town(1),%town(2),%town(3),%town(4);
/* on log
My Town,Your Town,His Town,Her Town
*/
于 2009-09-17T19:24:04.123 に答える
0

または、コードと名前の両方をパラメーターとしてマクロに渡すだけではどうですか? このような?

%MACRO DOSTUFF(CODE=, NAME=);
DO STUFF...;
PROC EXPORT DATA=XYZ OUTFILE="&NAME."; RUN;
%MEND;

DATA _NULL_;
SET TOWNS;
CALL EXECUTE("%DOSTUFF(CODE=" || STRIP(CODE) || ", NAME=" || STRIP(NAME) || ");");
RUN;
于 2009-09-21T03:34:50.003 に答える