2012-03-05 77 views
0

使用SAS宏,我想使用数据驱动方法生成文件的子集。有人可以指导我从哪里开始? 例如,我有一个数据集类似以下内容:SAS:宏生成数据驱动子集数据文件

data student; 
var v1 $ v2 $ v3; 
datalines ; 
f j 20 
f j 20 
f j 22 
f s 18 
f s 18 
m j 19 
m j 19 
m s 20; 

使用“如果”声明每个变量的类别,而不是,我想SAS宏识别变量的每个值,使数据的子集。我是否需要查看循环函数或symput(在生成proc freq之后)?谢谢你,KKK

+0

我编辑的帖子...请问上面产生一个真正的样本数据组?你能否展示如何处理这个样本数据? – 2012-03-05 19:58:18

+0

我想生成5个子集数据,包括变量值,如1)f,j,20 2)f,j,22 3)m,j,19 4)m,s,20,5)f,f,s ,18。由于v1和v2是字符变量,因此很难使用循环(或者我可以使用do group?)。我在考虑是否应该使用%scan来识别字符值,然后使用v3的循环。 – user634455 2012-03-05 20:51:00

+0

甚至使用proc sql? – user634455 2012-03-05 20:54:09

回答

2

这是一个相当简单的方式:

data student; 
    input v1 $ v2 $ v3; 
    cards ; 
    f j 20 
    f j 20 
    f j 22 
    f s 18 
    f s 18 
    m j 19 
    m j 19 
    m s 20 
    ; 
run; 

%macro make_dsns; 

    proc sql; 
     create table dsn_list as 
     select distinct 
      v1, 
      v2, 
      v3 
     from student 
     ; 
    run; 

    data _null_; 
     retain count 0; 
     set dsn_list end=last; 
     count = count + 1; 
     dsn_name = trim(left(v1)) || trim(left(v2)) || trim(left(v3)); 
     dsn_reference = "dsn" || trim(left(count)); 
     call symput(dsn_reference , dsn_name); 
     if last then do; 
     call symput("max_count" , count); 
     end; 
    run; 

    data 
     %do count = 1 %to &max_count; 
     &&dsn&count 
     %end; 
     ; 
     set student; 
     drop reference; 
     reference = trim(left(v1)) || trim(left(v2)) || trim(left(v3)); 
     %do count = 1 %to &max_count; 
     if trim(left(reference)) eq trim(left("&&dsn&count")) then output &&dsn&count; 
    %end; 
    run; 

%mend make_dsns; 

%make_dsns; 
1

没有宏观你可以这样做:

data _null_; 

declare hash group; 
group = _new_ hash(ordered: 'ascending'); 
group.definekey('_unique_Key'); 
group.definedata('v1', 'v2', 'v3'); 
group.definedone(); 

do until (last.v3); 
set student; 
    by v1 v2 v3 notsorted; 
    _unique_key + 1; 
    group.add(); 
end; 

group.output(dataset: cats(v1,v2,v3)); 
rc = group.delete(); 
run;