Макрос индекс sas или другое? - PullRequest
       21

Макрос индекс sas или другое?

2 голосов
/ 17 сентября 2009

У меня 169 городов, для которых я хочу выполнить макрос. Мне нужно, чтобы выходные файлы были сохранены с использованием названия города (а не кода города). У меня есть набор данных (TOWN) с кодом города и названием города. Можно ли иметь оператор% let, который устанавливается для имени города для каждой итерации, где i = код города?

Я знаю, что могу перечислить названия городов с помощью функции индекса, но я бы хотел, чтобы был установлен метод индекса, чтобы он устанавливал оператор% let для TOWN.town-name, когда i = TOWN .town-код.


Все ответы ниже возможны. Я использовал опцию% let =% scan (, & i). Ограничение состоит в том, что названия городов могут содержать более одного слова, поэтому я заменил подчеркивания пробелами, которые я исправлю позже.

Это мой макрос. Я вывожу отчет по процессам для каждого из 169 городов. Мне нужно, чтобы файл 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;

% ИСПРАВЬТЕ;

Ответы [ 2 ]

2 голосов
/ 17 сентября 2009

Я предполагаю, что причина, по которой вы хотите искать название города по индексу города, состоит в том, чтобы повторно вызывать макрос с каждым названием города. Если это так, то вам даже не нужно вообще заниматься городским индексным бизнесом. Просто назовите макрос с каждым названием города. Есть много способов сделать это. Вот один из способов использования 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
*/
0 голосов
/ 21 сентября 2009

Или как насчет того, чтобы просто передать код и имя макросу в качестве параметров? Как это?

%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;
...