用SAS中的另一对范围拆分一对日期范围

  • 本文关键字:范围 拆分 日期 SAS sas
  • 更新时间 :
  • 英文 :


我一直在做这件事,但我没有得到预期的数据集。

下面我有一个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

数据集1中的范围可能与数据集2中的范围完全重叠,并溢出到下一行或位于数据集2的范围内。数据集2中的范围在行之间没有间隙。

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

如果您的示例数据是可表示的,请尝试此操作。我假设最后两个变量的变量名称为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 

最新更新