首页 > 解决方案 > 迭代 SAS 中的自定义集

问题描述

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

我的想法是生成用于过滤的 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])

我知道这不是正确的方法,但我希望有人能给我一些关于正确执行它的信息。

谢谢!!

标签: loopsmacrossas

解决方案


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

推荐阅读