SAS: Как ссылаться на глобальную макропеременную для создания новой таблицы или набора данных? - PullRequest
0 голосов
/ 26 октября 2018

У меня возникли проблемы со ссылкой на глобальную переменную макроса вне макроса для создания нового набора данных.Глобальная переменная была создана для запуска цикла создания нескольких годовых наборов данных с использованием вектора указанных лет, как вы можете видеть в приведенном ниже коде:

%macro loopyear;
    %global year;
    %do year = 2004 %to 2017;

proc import datafile = "C:\Filepath\blah.txt"
    dbms = dlm out = blah&year.;  /*Creates a dataset for each year, e.g. blah2004, blah2005, etc.) */
    delimiter = " ";
    getnames = no;
run;

data blah&year.;
    set blah&year.;
    year = &year.;
run;

proc sql;
    create table blah&year._rail as 
        select year, var1, var2, var3, var4
        from blah&year.
        where var2= "rail";
quit;

    %end;
%mend loopyear;
%loopyear;

/*Merge all year datasets into one master set*/

data blah_total;
    set blah&year._rail;
run;

Когда я пытаюсь создать набор основных данных внеоднако в макросе я получаю следующую ошибку:

data blah;
    set blah&year._rail;
run;
ERROR: File work.blah2018_rail.data does not exist

Это разочаровывает, потому что я пытаюсь создать основной набор только на основе данных за 2004-2017 гг., как указано в переменной макроса.Может ли кто-нибудь помочь мне определить мою ошибку - это то, как я определил глобальную переменную, или я где-то пропускаю шаг?Любая помощь приветствуется.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

%macro loopyear;
    %global year;
    %do year = 2004 %to 2017;

proc import datafile = "C:\Filepath\blah.txt"
    dbms = dlm out = blah&year.;  /*Creates a dataset for each year, e.g. blah2004, blah2005, etc.) */
    delimiter = " ";
    getnames = no;
run;

data blah&year.;
    set blah&year.;
    year = &year.;
run;

proc sql;
    create table blah_rail_&year. as 
        select year, var1, var2, var3, var4
        from blah&year.
        where var2= "rail";
quit;

    %end;
%mend loopyear;
%loopyear;

/*Merge all year datasets into one master set*/

data blah_total;
    set blah_rail: ;
run;
0 голосов
/ 26 октября 2018

Это интересная особенность циклов выполнения макросов и шагов данных в SAS - счетчик цикла увеличивается до того, как проверяется условие выхода, поэтому после запуска цикла он будет на один шаг больше вашего значения остановки, например:

%macro example;
  %do i = 1 %to 3;
    %put i = &i;
  %end;
  %put i = &i;  
%mend;
%example;

Вывод:

i = 1
i = 2
i = 3 
i = 4

Для вашего последнего шага вы, вероятно, захотите, чтобы оператор set выглядел следующим образом:

set blah2004_rail ... blah2017_rail;

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

set %do year = 2004 %to 2017; blah&year._rail %end;;

Вторая точка с запятой важна!Вам нужен один, чтобы закрыть %end, и один, чтобы завершить оператор set.

...