SAS: Как создать наборы данных в l oop на основе макропеременной - PullRequest
0 голосов
/ 17 марта 2020

У меня есть макропеременная, подобная этой:

%let months = 202002 202001 201912 201911 201910;

Как видно, у нас есть 5 месяцев, разделенных пробелом ''.

Я хотел бы создать 5 наборов данных, таких как a_202002, a_202001, a_201912, a_2019_11, a_201910. Как я могу запустить это в l oop и создать 5 наборов данных вместо того, чтобы 5 раз писать шаг данных?

Псевдокод:

for m in &months.
    data a_m;
        ....
        ....
    run;

Как это сделать в SAS? Я пытался %do_over, но это мне не помогло.

Ответы [ 3 ]

2 голосов
/ 17 марта 2020

Используйте знания, полученные из ответа @Tom в предыдущем вопросе, для создания макроса

%macro datasets_for_months ...
  ...
%mend;

Укажите наборы выходных данных в операторе DATA:

DATA %datasets_for_months(...);
  ...
RUN;

Прямые строки для указания c выходных наборов данных путем именования набора данных, например

  OUTPUT a_202002;

Примечание:

  • Шаг без операторов OUTPUT будет неявно выводиться для всех данных set
  • Шаг с оператором OUTPUT приведет к тому, что записи будут записаны либо во ВСЕ наборы данных, либо только в те, которые указаны в операторе:
    • OUTPUT записывает записи во все выходные данные наборы данных
    • OUTPUT data-set-name-1 записывает записи только в указанные наборы данных

Документация DATA Step охватывает то, что вам нужно знать в подробнее

Оператор DATA
Начинает шаг DATA и предоставляет имена для любого вывода, такого как наборы данных SAS, представления или программы.
...
Синтаксис

Форма 1:
ДАННЫЕ государственные деятели t для создания выходных наборов данных

DATA <data-set-name-1 <(data-set-options-1)>>
... <data-set-name-n <(data-set-options-n)>> ... ;

ДОРОГА ВПЕРЕДИ

Вероятно, вы обнаружите, что month будет лучше обслуживаться в концептуальной роли в качестве категориальной переменной в одном большом наборе данных, а не разбивать данные на несколько названных по месяцам наборов данных.

Категориальная переменная позволит вам использовать возможности операторов SAS для разделения и разделения, таких как WHERE, BY и CLASS, при обработке, составлении отчетов и визуализации ваших данных при различных комбинациях значений уровня класса.

1 голос
/ 17 марта 2020

Вы можете использовать функцию% DO l oop и функцию% SCAN (). Используйте функцию COUNTW (), чтобы найти верхнюю границу.

%do i=1 %to %sysfunc(countw(&months,%str( )));
  %let month=%scan(&months,&i,%str( ));
  ....
%end;
1 голос
/ 17 марта 2020

Как насчет этого подхода? Создайте имена наборов данных в другой макропеременной и используйте один шаг данных.

%let months = 202002 202001 201912 201911 201910;

data _null_;
   ds = prxchange('s/(\d+)/a_$1/', -1, "&months.");
   call symputx('ds', ds);
run;

options symbolgen;
data &ds.;
run;
...