我使用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
可以提供帮助。
答案 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,我也可以帮助你。