【问题标题】:SAS by merge with additional conditionSAS 通过与附加条件合并
【发布时间】:2016-11-15 03:13:00
【问题描述】:

我有两个 SAS 数据集,我试图将它们与一个公共 by​​ 变量合并在一起(在 by 变量下方的 mcve 中是record)。不过,这种合并有一个条件,这就是我遇到的麻烦。我需要通过recordfileonefiletwo 合并,但filetwo 中与fileone 匹配的行必须满足以下条件:intervention_date 必须在该记录之后'case_start (如果record 有多个case_start,则在下一个case_start 之前)。

这是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;

指出一些事情,来自fileonerecord 可以有多个case_start 日期(请参阅record=1),对于每个recordcase_start 日期,一个来自@987654344 的record @ 可以有多个intervention_date(参见record=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;

现在,像简单的 by merge 这样的东西不起作用,因为它只匹配 record:

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

对于将这两个数据集与此日期条件合并有什么建议吗?这可能来自一个简单的 SAS 数据步骤,因为我对 proc sql 不是很熟悉吗?我已经看到使用 proc sql 完成此操作,但想了解数据步骤。

【问题讨论】:

    标签: merge sas


    【解决方案1】:

    您也许可以使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多