2

我有 169 个城镇,我想为其迭代一个宏。我需要使用城镇名称(而不是城镇代码)保存输出文件。我有一个TOWN包含城镇代码和城镇名称的数据集 ( )。是否可以为%leti=town-code 的每次迭代设置一个设置为 town-name 的语句?

我知道我可以使用索引函数列出城镇名称,但我想要一种设置索引函数的方法,以便%let在 i=TOWN.town-code 时为 TOWN.town-name 设置一条语句。


下面的所有答案似乎都是可能的。我现在使用了 %let = %scan( ,&i) 选项。一个限制是城镇名称可以超过一个单词,所以我用下划线代替了我稍后更正的空格。

这是我的宏。我将 proc 报告输出到 169 个城镇中的每一个的 excel 中。我需要将 excel 文件保存为城镇名称,并且标题中需要包含城镇名称。然后,在 Excel 中,我将所有 169 个工作表合并到一个工作簿中。

%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

我的猜测是,您要按城镇索引查找城镇名称的原因是重复调用每个城镇名称的宏。如果是这样的话,那你根本就不需要涉足城镇指数业务了。只需使用每个城镇名称调用宏即可。有很多方法可以做到这一点。这是使用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.
*/

如果您确实需要进行表查找,那么一种方法是将您的城镇名称转换为数字格式并编写一个简单的宏来检索名称,给定一个索引值。就像是:

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 回答