Есть ли способ пропустить пропущенные наборы данных при переборе имен? - PullRequest
2 голосов
/ 08 июля 2019

У меня есть несколько наборов данных в SAS, которые я пытаюсь объединить в один больший набор, который я буду фильтровать позже. Все они называются что-то вроде table_201802. Моя проблема в том, что есть несколько пропущенных месяцев (то есть существует table201802 и table201804 и выше, но не table201803.

Я достаточно новичок в SAS, но до сих пор я пытался создать новый набор данных с именем output testing и запустить макро-цикл, повторяющийся по именам (они идут от 201802 до 201903 и это ежемесячные данные, поэтому ничего от 812 до 900 не существует).

data output_testing;
set
%do i=802 %to 812;
    LIBRARY.table_201&i
%end;
;
run;
%mend append;

Я хочу, чтобы код игнорировал отсутствующие таблицы и просто искал те, которые существуют, а затем добавлял их в новую таблицу output_testing.

Ответы [ 3 ]

4 голосов
/ 08 июля 2019

Если префикс имени таблицы различен, и вы уверены, что структуры данных в таблицах согласованы (имена переменных, типы и длины одинаковы), то таблицу можно составить с использованием списков префиксов имен таблиц (:)

Для определенного известного диапазона имен таблиц вы также можете использовать нумерованные списки диапазонов (-), вкладку

data have190101 have190102 have190103;
  x =1;
run;

data want_version1_stack; /* any table name that starts with have */
  set have:;
run;

data want_version1b_stack; /* 2019 and 2020 */
  set have19: have20:;
run;

options nodsnferr;
data want_version2_stack; /* any table names in the iterated numeric range */
  set have190101-have191231;
run;
options dsnferr;

С помогает

Использование списков наборов данных с SET
Вы можете использовать списки наборов данных с SET заявление. Списки наборов данных обеспечивают быстрый способ ссылки на существующие группы наборов данных. Эти списки наборов данных должны быть либо префиксом имени списки или нумерованные списки диапазонов.

Списки префиксов имен относятся ко всем данным наборы, которые начинаются с указанной строки символов. Например, установить Продажи1 :; говорит SAS прочитать все наборы данных, которые начинаются с "SALES1", например как SALES1, SALES10, SALES11 и SALES12. >

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

  • продажа1 продажа2 продажа3 продажа4
  • Продажи1-Продажи4
3 голосов
/ 08 июля 2019

Некоторый код макроса с процедурой добавления должен решить проблему.


%let n = 10;
%macro get_list_table;

%do i = 1 %to &n;
    %let dsn = data&n;
    %if %sysfunc(exist(&dsn)) %then %do;
        proc append data = &dsn base = appended_data  force;
        run;

    %end;
%end;
%mend;

1 голос
/ 08 июля 2019

Вы можете использовать шаблоны:

data output_testing;
set LIBRARY.table_201:
;
run;

, но в этом случае вы получите в наборе все таблицы, которые начинаются с "table_201".Например:

LIBRARY.table_201tablesss LIBRARY.table_201ed56

...