Итерация по пользовательскому набору в SAS - PullRequest
0 голосов
/ 19 октября 2018

Прежде всего, извините за мой плохой английский, но это потому, что я не родной.Я тоже новичок в программировании на SAS, и мне нужен кто-то, кто поможет мне с этой проблемой, борющейся со мной.У меня есть один набор данных A, содержащий числовое поле YM, представляющее год и месяц (например, 200902), который я использую для фильтрации набора данных.В частности, я хочу получить N отфильтрованных наборов данных, используя N разностных значений YM.

  • A_filtered_200901 = A.filter (YM == 200901)
  • A_filtered_200902 = A.filter (YM == 200902)
  • A_filtered_200903 = A.filter (YM== 200903)
  • ...

Моя идея состояла в том, чтобы сгенерировать последовательность YM, используемую для фильтрации, и затем передать ее в качестве аргумента макросу%, содержащему PROC SQL.В коде / псевдокоде:

data ym_dataset;
    date = input(put(20090201, 8.), yymmdd8.);
    do i = 1 to 3;
        aux1 = intnx('MONTH', date, i);
        aux2 = put(aux1, yymmddn8.);
        list_of_ym_values = substr(aux2 , 1, 6);
        output;
    end;
run;

%macro my_macro(list_of_ym_values);
    proc sql;
    %do i = 1 %to dim(&list_of_ym_values)
      select * 
      from A 
      where YM = &list_of_ym_values(i)
    %end        
    quit;
%mend my_macro;

%my_macro(ym_dataset[list_of_ym_values])

Я знаю, что это неправильный подход, но я надеюсь, что кто-то может пролить мне свет на то, как это сделать правильно.

Спасибо !!

1 Ответ

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

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

 /* create macrovariable with all values*/  
proc sql;
select list_of_ym_values into :List
 separated by "|" from ym_dataset;
%put &list;

/* scan through each variable and create new dataset*/
 %macro one;
 %do i=1 %to %sysfunc(countw(&list),"|") ;
 %let val= %scan(&list,&i,|);
proc sql;
create table want_&val as
select * from ym_dataset
where list_of_ym_values = "&val";
%end;
 %mend;
%one;
...