Как получить доступ к n-й элемент массива в цикле в макросе SAS? - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь получить i-й элемент массива в цикле% do в определении макроса и создать набор данных с именем элемента, но все, что я могу получить, это что-то вроде "z1" и т. Д. Это то, что я так далеко

%macro print(set,groupvar);
  proc sql ;
  select put(count(distinct &groupvar),1.)
 into :hm
 from &set
 ;


  select distinct set
  into :z1-:z&sysmaxlong
  from &set
  ;
    quit;

  data %do i =1 %to &hm;
        %scan(&z, &i);
       %end;
    ;
%mend;

Я также попробовал z [& i] вместо %scan(&z,&i), но все равно не повезло

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Оператор output не может указать динамическую таблицу назначения. Вам нужно будет создать код обоев для вывода в соответствующую таблицу на основе критериев разделения.

Ваш макрос должен будет создать макропеременные для поддержки этого шаблона кода

data &out1 &out2 … &outN;
  set input_data;
  select;
    when (&case1) output &out1;
    when (&case2) output &out2;
    …
    when (&caseN) output &outN;
    otherwise;
  end;
run;

Некоторые хитрые SQL могут поддерживать шаблон

data &outlist;
  set input_data;
  select;
    &whenStatements;
    otherwise;
  end;
run;

Метод объекта хеша .output () может указать динамическое назначение для сохранения содержимого хеша. Рассмотрим случай «Разделить таблицу на таблицы подмножеств, имена которых основаны на значениях переменных» или «Разделить один набор данных на несколько наборов данных, названных в соответствии с групповой переменной». Некоторые методы требуют предварительного анализа данных (как в опубликованном вами коде), другие - нет.

Существует некоторый хеш-код разделителя на https://www.devenezia.com/downloads/sas/samples/hash-6.sas

Вы можете найти другие разделители данных в сообществе sas.

0 голосов
/ 27 июня 2018

Если вы хотите использовать %scan(), просто создайте одну макропеременную.

select distinct set
   into :z separated by ' '
   from &set
;
%let hm=&sqlobs;

Оператор DATA заканчивается на первой точке с запятой. Но вы генерируете &hm+1 точек с запятой вместо одной. Удалите ложную точку с запятой из цикла %do.

data
%do i =1 %to &hm;
  %scan(&z, &i)
%end;
;
0 голосов
/ 26 июня 2018

Вопросы:

  1. У вас есть макропеременная SET, но у вас есть отчетливый SET в запросе выбора, это то, что вы хотели?

    select distinct set
    
  2. Вам не нужно указывать конец ряда при создании макропеременных.

    select distinct &set into :z1- from &set; quit;
    
  3. Вы создали серию макропеременных Z1-Zn, но попробуйте использовать SCAN для получения значений? Они не хранятся в массиве, он хранится в серии макропеременных, таких как Z1, Z2 и т. Д.

...