【问题标题】:Split pair of ranges of dates by another pair of ranges in SAS用SAS中的另一对范围分割一对日期范围
【发布时间】:2020-08-15 04:06:53
【问题描述】:

我一直在研究这个,但我没有按预期获得我的数据集。

我有一个下面给出的 SAS 数据集 1 用于示例观察。该表给出了日期的开始和结束范围。

Dataset 1

id  start         end      var1
A   03/15/1992  03/20/1992  1
A   03/24/1992  03/26/1992  2
A   03/28/1992  03/31/1992  5
B   06/06/1994  06/06/1994  1

我有另一个 SAS 数据集,它给出了应包含数据集 1 的开始和结束范围的日期范围的外端。

Dataset 2

A   01/01/1992  03/16/1992  3
A   03/17/1992  03/19/1992  4
A   03/20/1992  05/25/1992  6
B   06/06/1994  06/06/1994  8

最终表应具有数据集 1 的确切范围,并且应调整数据集 2 的范围,以便结束日期与后续行和前面的行连续。换句话说,决赛桌应该有不重叠的间隔。

Final expected dataset


A   01/01/1992  03/14/1992  .    3
A   03/15/1992  03/20/1992  1   .    <---- range stays the same as in dataset1
A   03/21/1992  03/23/1992  .    6
A   03/24/1992  03/26/1992  2   .    <---- range stays the same as in dataset1
A   03/27/1992  03/27/1992  .    6
A   03/28/1992  03/31/1992  5   .    <---- range stays the same as in dataset1
A   04/01/1992  05/25/1992  .    6
B   06/06/1994  06/06/1994  1   8

我不确定这是否可以在 SAS 中实现。

对我之前的帖子的补充:我还有另一个数据需要完全按照上面的方式调整范围,但我没有 dataset1 中的 ID,而是两者之间共有的另一个标识符数据集。下面给出的示例数据集:

      Dataset 1
          
          id2   start      end      var1
        A1122 03/15/1992 03/20/1992 1
        A1122 03/24/1992 03/26/1992 2
        A1122 03/21/1992 03/22/1992 2
        A2222 03/25/1994 03/25/1994 1
        A1122 01/01/1992 01/01/1992 1


 Dataset 2
  
id1  id2  start       end     var2
    A A1122 01/01/1992 03/16/1992 3
    A A1122 03/17/1992 03/19/1992 4
    A A2222 03/20/1992 05/25/1992 6
    B A1122 06/06/1994 06/06/1994 8

最终数据集必须完全保留数据集 1 中的所有范围,并且要调整数据集 2 中的范围以保持连续性。

Final dataset
   id1  id2  start       end  var1  var2
A A1122 01/01/1992 01/01/1992 1 . <-same as dataset 1
A A1122 01/02/1992 01/14/1992 . 3
A A1122 03/15/1992 03/16/1992 1 2 <-from dataset 1 and 2
A A1122 03/17/1992 03/19/1992 1 4 <-from dataset 1 and 2
A A2222 03/20/1992 03/20/1992 1 6 <-from dataset 1 and 2
A A1122 03/21/1992 03/22/1992 2 . <-same as dataset 1
A A1122 03/23/1992 03/24/1992 . 6
A A2222 03/25/1992 03/25/1992 1 . <-same as dataset 1
B A1122 06/06/1994 06/06/1994 . 8

dataset1 中的范围可能与 dataset2 中的范围完全重叠并溢出到下一行或位于 dataset2 的范围内。 dataset2 中的范围在行之间没有间隙。

*更多解释:*最终数据集还应保留 dataset2 的“结束”日期,以便相应的 var1 与范围正确关联。为了实现这一点,数据集 1 中的范围可能必须拆分,例如。 obs。 # 最终数据集中的 3,4,5。

【问题讨论】:

    标签: sas


    【解决方案1】:

    如果您的示例数据是可表示的,试试这个。我假设你最后两个变量的变量名称为 var1var2

    data one;
    input id $ (start end)(:mmddyy10.) var1;
    format start end mmddyy10.;
    datalines;
    A 03/15/1992 03/20/1992 1
    A 03/24/1992 03/26/1992 2
    A 03/28/1992 03/31/1992 5
    B 06/06/1994 06/06/1994 1
    ;
    
    data two;
    input id $ (start end)(:mmddyy10.) var1;
    format start end mmddyy10.;
    datalines;
    A 01/01/1992 03/16/1992 3
    A 03/17/1992 03/19/1992 4
    A 03/20/1992 05/25/1992 6
    B 06/06/1994 06/06/1994 8
    ;
    
    data want (drop=s);
       merge one(keep=start rename=start=s) two(rename=var1=var2);
       end = s - 1;
       var1 = .;
       output;
       set one;
       var2 = .;
       output;
    run;
    

    结果:

    id  start       end         var2 var1 
    A   01/01/1992  03/14/1992  3    . 
    A   03/15/1992  03/20/1992  .    1 
    A   03/17/1992  03/23/1992  4    . 
    A   03/24/1992  03/26/1992  .    2 
    A   03/20/1992  03/27/1992  6    . 
    A   03/28/1992  03/31/1992  .    5 
    B   06/06/1994  06/05/1994  8    . 
    B   06/06/1994  06/06/1994  .    1 
    

    【讨论】:

    • 非常感谢 draycut!如此紧凑的代码。我写的代码太复杂了。这完美地工作。在我的数据集中“一”中,每个 ID 的观察次数与“二”中的观察次数不同,例如。 ID 1 可能缺少“一个”的第三个观察结果。
    • 刚刚对我的原始帖子进行了一些更改。你能帮我写代码吗?谢谢!
    • 好的。给定新的数据集,您需要的结果是什么样的?一样吗?
    • @daycut。刚刚发布了最终结果。
    • 我不明白这里的逻辑。您说“最终数据集必须完全按原样保留 dataset1 的所有范围”。但是数据集 1 中 obs 1 的日期范围没有保留?请详细解释您是如何从两个发布的数据集中获得结果的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多