SAS,按字符级别拆分数据

时间:2018-04-17 22:46:23

标签: sas

我有一个数据集(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;

2 个答案:

答案 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