SAS:如何将数据拆分为具有顺序名称的子集。

时间:2015-09-25 08:53:35

标签: sas subset

我使用SAS将数据集拆分为具有以下命名约定的子集:sub001,sub002,sub003 ....我的数据集看起来像

ID   var1
AA   ...
AA   ...
AB   ...
AC   ...
...  ...
AZ   ...
...  ...
ZZ   ...

我可以手动完成。

data sub001 sub002.....sub676;
set data;
if id='AA' then output sub001;
.....
if id='ZZ' then output sub676;
run;

但有没有简单的方法呢?我认为%macro%do可以提供帮助。

1 个答案:

答案 0 :(得分:0)

如果您希望将它们全部拆分为一堆数据集,则可以使用宏来执行此操作。这是我最喜欢的宏编程技巧之一:

步骤1:将所有不同的ID读入空格分隔的宏变量

proc sql noprint;
    select distinct strip(upcase(id) )
    into :all_ids separated by ' '
    from have;
quit;

第2步:循环显示&all_ids中的总字数,过滤have每个值& all_ids

options nonotes;

%macro split;
    %do i = 1 %to %sysfunc(countw(&all_ids) );
        data sub_&i;
            set have;
            where upcase(ID) = "%scan(&all_ids, &i)";
        run;
    %end;
%mend;
%split;

options notes;

因为我们循环空格分隔的宏变量&all_ids中的单词总数,所以&i的值与&all_ids中每个单词的位置之间存在1-1的对应关系{1}}。例如:

 &i  |        &all_ids      
LOOP   WORD NUMBER      WORD           
 1         1             AA
 2         2             AB
 3         3             AC

这不是最有效的方法,因为我们每次都会向磁盘写一个新的数据集,但除非您的资源非常有限,或者您拥有数百GB或数百GB的怪异数据集或更多,它应该很快完成。如果你需要一种方法来减少I / O,我也可以帮助你。