我有一个数据集(test1),我想把它分成两个或多个数据集。 第一列是重复序列,第二列是具有不同级别的var(可以是2,3,4或更多)。我需要做的是自动(所以如果var2 = a不起作用)将数据按第二列的级别分割。我这个自动化是第二个变量的原因各不相同,有时它有3个级别,有时2个,所以我不能使用fix语句。谢谢。
data test1;
input var1$ var2$ ;
datalines;
1 a
2 a
3 a
1 b
2 b
;
run;
data test1_output1;
input var1$ var2$ ;
datalines;
1 a
2 a
3 a
;
run;
data test1_output2;
input var1$ var2$ ;
datalines;
1 b
2 b
;
run;
答案 0 :(得分:1)
使用call execute很容易,假设您的数据已经排序。
data _null_;
set test1;
by var2;
if first.var2 then call execute(
'data data_'||strip(var2)||';
set test1;
where var2="'||strip(var2)||'";
run;');
run;
修改强>
data _null_;
set test1;
by var2;
if first.var2 then do;
n+1;
call execute(
'data data_'||strip(n)||';
set test1;
where var2="'||strip(var2)||'";
run;');
end;
run;
答案 1 :(得分:0)
如果您的数据集可以进行排序,即它具有唯一且不同的级别,请按照以下代码段进行操作。这是一个不是很短的剧本,但在我的案例中完成了这项工作。
先决条件(和宏变量)
proc sql noprint;
select distinct var2 into:var2s separated by ','
from work.test1
order by 1;
quit;
实际拆分器
%macro dssplit;
%do i = 1 %to %sysfunc(countw(%superq(var2s)));
%let varsplit = %sysfunc(strip(%scan(%superq(var2s), &i, %str(,)))); *making sure to get rid of erroneous spaces;
proc sql;
create table testsplit&i._%sysfunc(compress(&varsplit.)) as
select * from work.test1
where var2 = "&varsplit.";
quit;
%end;
%mend dssplit; %dssplit;
在您的情况下,这将创建名称为testsplit1_a
&的数据集。 testsplit2_b
。