按照您的要求拆分数据集的一种简单方法是使用具有多个输出数据集的单个数据步骤,其中每个输出数据集都有一个 KEEP= dataset 选项列出要保留的变量。例如:
data split1(keep=Name Age Height) split2(keep=Name Sex Weight);
set sashelp.class;
run;
因此,您需要获取变量列表,然后将其分组为 250 个或更少的集合。然后你可以使用这些分组来生成类似上面的代码。这是一种使用 PROC CONTENTS 获取变量列表并使用 CALL EXECUTE() 生成代码的方法。
我将使用宏变量来保存输入数据集的名称、每个数据集需要保留的关键变量以及每个数据集中要保留的最大变量数。
因此对于上面的示例,这些宏变量值将是:
%let ds=sashelp.class;
%let key=name;
%let nvars=2;
所以使用PROC CONTENTS来获取变量名列表:
proc contents data=&ds noprint out=contents; run;
现在运行一个数据步骤将它们分成组并生成一个成员名称以用于新的拆分数据集。计数时,请确保不要将 KEY 变量包含在变量列表中。
data groups;
length group 8 memname $41 varnum 8 name $32 ;
group +1;
memname=cats('split',group);
do varnum=1 to &nvars while (not eof);
set contents(keep=name where=(upcase(name) ne %upcase("&key"))) end=eof;
output;
end;
run;
现在您可以使用该数据集来驱动代码的生成:
data _null_;
set groups end=eof;
by group;
if _n_=1 then call execute('data ');
if first.group then call execute(cats(memname,'(keep=&key'));
call execute(' '||trim(name));
if last.group then call execute(') ');
if eof then call execute(';set &ds;run;');
run;
以下是 SAS 日志的结果:
NOTE: CALL EXECUTE generated line.
1 + data
2 + split1(keep=name
3 + Age
4 + Height
5 + )
6 + split2(keep=name
7 + Sex
8 + Weight
9 + )
10 + ;set sashelp.class;run;
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.SPLIT1 has 19 observations and 3 variables.
NOTE: The data set WORK.SPLIT2 has 19 observations and 3 variables.