2016-11-14 14 views
0

私は共通の変数(by変数の下のmcveにはrecord)と一緒にマージしようとしている2つのSASデータセットがあります。このマージの条件がありますが、それは私が問題を抱えていることです。私はrecordによってfiletwofileoneをマージする必要がありますが、fileoneと一致filetwoからの行には、次の条件を満たしている必要があります:intervention_datecase_startそれが記録した後でなければなら(そして次のcase_startrecordは、複数のcase_startを持っている場合)。ここでSAS by merge with additional condition

fileoneの例です:

data fileone; 
    input record case_start :date9. age; 
    format case_start date9.; 
    datalines; 
1 01jun2015 10 
1 15jan2016 11 
1 19jul2016 11 
2 11aug2016 15 
; 
run; 

はここfiletwoの例です:

data filetwo; 
    input record intervention_date :date9. county :$10.; 
    format intervention_date date9.; 
    datalines; 
1 24mar2016 Denver 
1 10sep2015 Denver 
1 20oct2016 Denver 
2 15nov2016 Boulder 
2 12dec2016 Boulder 
; 
run; 

fileoneからrecordが複数case_startの日付を持つことができ、いくつかのことを指摘するには(record=1を参照してください)それぞれrecordcase_startの日付の場合、recordからfiletwoまでは複数のintervention_daterecord=2参照)。より具体的には

が、これは私が作るしようとしているものです:

data what_merge_should_look_like; 
    input record case_start :date9. age intervention_date :date9. county :$10.; 
    format case_start intervention_date date9.; 
    datalines; 
1 01jun2015 10 10sep2015 Denver 
1 15jan2016 11 24mar2016 Denver 
1 19jul2016 11 20oct2016 Denver 
2 11aug2016 15 15nov2016 Boulder 
2 11aug2016 15 12dec2016 Boulder 
; 
run; 

、それだけrecordで一致だからマージすることにより、簡単なような何かがうまくいかない:

/* data already sorted on by variable */ 
data fileone_two; 
    merge fileone 
      filetwo; 
    by record; 
run; 

これらの2つのデータセットをこの日付条件でマージするよう提案はありますか?私はproc sqlにあまり慣れていないので、これは簡単なSASデータステップから可能ですか?私はこれをproc sqlでやってみましたが、データステップについて知りたいと思います。

答えて

0

SETを使用してファイルを日付でインターリーブすることができます。その後、FILEONEの値をFILETWOのレコードに保持することができます。 RECORDの新しい値を開始するときに保持されている値をクリアします。

proc sort data=filetwo; by record intervention_date ; run; 

data want ; 
    set fileone (in=in1 rename=(case_start=intervention_date age=agex)) 
     filetwo (in=in2) 
    ; 
    by record intervention_date ; 
    if first.record then call missing(case_start,age); 
    format case_start date9.; 
    retain case_start age ; 
    if in1 then case_start = intervention_date ; 
    if in1 then age=agex ; 
    if in2 then output; 
    drop date agex ; 
run;