遍历SAS中的自定义集

时间:2018-10-19 10:20:12

标签: loops macros sas

首先,为我的英语不好而道歉,但这是因为我不是本地人。我也是SAS编程的新手,我需要有人帮助我解决这个困扰我的问题。 我有一个数据集A,其中包含一个表示年份和月份(例如200902)的数字字段YM,用于过滤数据集。特别是,我想使用N个差值YM获得N个过滤的数据集。

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

我的想法是生成用于过滤的YM序列,然后将其作为包含PROC SQL的%macro的参数。在代码/伪代码中:

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 :(得分:0)

您需要遍历变量列表,并且可以在宏变量中创建此值。但是正如@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;