2012-03-05 76 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;