问题描述
我一直在努力,但是我没有得到预期的数据集。
我有一个下面给出的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中实现。
我先前的帖子中的补充内容:我还有另一个数据,需要完全按照上面的范围进行调整,但是我在数据集1中没有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的范围内。数据集2中的范围在行之间没有间隙。
*更多说明:*最终数据集还应保留数据集2的“结束”日期,以便将相应的var1与范围正确关联。为此,数据集1中的范围可能必须拆分,例如。肥胖#3,4,5在最终数据集中。
解决方法
如果您的示例数据可以表示,请尝试此操作。我假设最后两个变量的变量名称分别为var1
和var2
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