一个动态SAS程序,用于合并相互嵌套的事件的日期

一个动态SAS程序,用于合并相互嵌套的事件的日期,sas,Sas,你好, 我想编写一个动态程序,帮助我标记嵌套在合并日期中的事件的开始和结束日期,合并日期位于所附示例中每个Pt.ID的顶部。如果每个Pt.ID只有一个这样的合并期,我可以轻松地执行这些操作。然而,每个Pt可能有一个以上的合并期。ID.(如第二个零件ID 1002所示)。如示例所示,在标志变量中,属于合并期间的事件标记为“Y”,如果不属于合并期间,则在此变量中标记为“N”。我如何编写一个程序,说明每个Pt.ID的所有合并期间,然后将其与特定患者的其他事件的日期进行比较,并标记属于这些合并期间的事件

你好,

我想编写一个动态程序,帮助我标记嵌套在合并日期中的事件的开始和结束日期,合并日期位于所附示例中每个Pt.ID的顶部。如果每个Pt.ID只有一个这样的合并期,我可以轻松地执行这些操作。然而,每个Pt可能有一个以上的合并期。ID.(如第二个零件ID 1002所示)。如示例所示,在标志变量中,属于合并期间的事件标记为“Y”,如果不属于合并期间,则在此变量中标记为“N”。我如何编写一个程序,说明每个Pt.ID的所有合并期间,然后将其与特定患者的其他事件的日期进行比较,并标记属于这些合并期间的事件


谢谢。

因此,将事件记录与时段记录合并,并计算事件是否在时段内。然后你就可以在所有的时间段内取最大值。 例如,下面是用于创建名为include的二进制1/0标志变量的示例代码

data Sample;
  infile datalines missover;
  input Pt_ID Event_ID Category $ Start_Date : mmddyy10. 
        Start_Day End_date : mmddyy10. End_day Duration 
  ; 
  format Start_date End_date mmddyy10.; 
datalines; 
1001  .  Moderate 8/5/2016  256  9/3/2016  285  30 
1001  1  Moderate 3/8/2016  106  3/16/2016  114  9 
1001  2  Moderate 8/5/2016  256  8/14/2016  265  10 
1001  3  Moderate 8/21/2016  272  8/24/2016  275  4 
1001  4  Moderate 8/23/2016  274  9/3/2016  285  12 
1002  .  Severe   11/28/2016  13  12/19/2016  34  22 
1002  .  Severe   2/6/2017  83  2/28/2017  105  23 
1002  1  Severe   11/28/2016  13  12/5/2016  20  8 
1002  2  Severe   12/12/2016  27  12/19/2016  34  8 
1002  3  Severe   1/9/2017  55 1/12/2017  58  4 
1002  4  Severe   2/6/2017  83  2/13/2017  90  8 
1002  5  Severe   2/20/2017  97  2/28/2017  105  9 
1002  6  Severe   3/17/2017  122  3/24/2017  129  8 
1002  7  Severe   5/4/2017  170  5/13/2017  179  10 
1002  8  Severe   5/24/2017  190  5/30/2017  196  7 
1002  9  Severe   6/9/2017  206  6/13/2017  210  5 
; 

proc sql ;
  create table want as
  select a.*
       , max(b.start_date <= a.start_date and b.end_date >= a.end_date ) as Included
  from sample a
  left join sample b
  on a.pt_id = b.pt_id and missing(b.event_id)
  group by 1,2,3,4,5,6,7,8
  order by a.pt_id, a.event_id, a.start_date , a.end_date
  ;
quit;
数据样本;
填充数据线;
输入Pt_ID事件_ID类别$Start_日期:mmddyy10。
开始日结束日:mmddyy10。结束日持续时间
; 
格式化开始日期结束日期mmddyy10。;
数据线;
1001  .  中度2016年8月5日256 2016年9月3日285 30
10011中等2016年3月8日106 2016年3月16日114 9
10012中等2016年8月5日256 2016年8月14日265 10
10013中度8/21/2016 272 8/24/2016 275 4
10014中度8/23/2016 274 9/3/2016 285 12
1002  .  严重的2016年11月28日13 2016年12月19日34 22
1002  .  严重2/6/2017 83 2/28/2017 105 23
1002 1严重的2016年11月28日13 2016年5月12日20 8
1002 2严重的2016年12月12日27 2016年12月19日34 8
1002 3严重1/9/2017 55 1/12/2017 58 4
1002 4严重2/6/2017 83 2/13/2017 90 8
1002 5严重2/20/2017 97 2/28/2017 105 9
1002 6严重2017年3月17日122 2017年3月24日129 8
1002 7严重2017年5月4日1705/13/2017 179 10
1002 8严重5/24/2017 190 5/30/2017 196 7
1002 9严重2017年6月9日206 2017年6月13日210 5
; 
proc-sql;
创建所需的表作为
选择a*
,最大值(b.开始日期=a.结束日期),包括在内
来自样本a
左连接样本b
在a.pt_id=b.pt_id和缺失(b.event_id)上
按1,2,3,4,5,6,7,8分组
按a.pt\u id、a.event\u id、a.start\u date、a.end\u date排序
;
退出

您尝试了什么?你能把数据作为数据而不是照片发布吗?您可以发布所需的结果吗?
retain
&数据步骤中的
数组
可以满足您的需要,即使规则有些复杂。如果标志值不依赖于多行“合并日期”,您也可以简单地在
event\u ID=.
event\u ID ne.
处连接数据,以查找哪些行具有
标志='Y'
,然后将
标志
信息连接回原始数据集。如何添加数据集程序而不超过此处的字符限制?由于这个限制,我不能做这件事@Tomdata样本;填充数据线;输入Pt_ID事件_ID类别$Start_日期:mmddyy10。开始日结束日:mmddyy10。结束日持续时间;格式化开始日期结束日期mmddyy10。;数据线;1001.2016年8月5日256 9/3/2016 285 30 1001 1中等3/8/2016 106 3/16/2016 114 9 1001 2中等8/5/2016 256 8/14/2016 265 10 1001 3中等8/21/2016 272 8/24/2016 275 4 1001 4中等8/23/2016 274 9/2016 285 12——下一篇文章将继续此代码@Tom1002.严重11/28/2016 13 12/19/2016 34 22 1002.严重2/6/2017 83 2/28/2017 105 23 1002 1严重11/28/2016 13 12/5 20 8 1002 2严重12/2016 27 12/19/2016 34 8 1002 3严重1/9 55 1/12/2017 58 4 1002 4严重2/6/2017 83 2/13/2017 90 8 1002 5严重2 2 2 2/20/2017 97 2/28 105 91002 6严重2017年3月17日122 2017年3月24日129 8 1002 7严重2017年5月4日170 5/13/2017 179 10 1002 8严重2017年5/24 190 5/30/2017 196 7 1002 9严重2017年6/9 206 6/13/2017 210 5;运行@汤姆:谢谢你。这正是我需要的。你是如何把这篇长文章写成一条评论的?评论很短。问题和答案可能要长得多。嗨,汤姆,关于这一点,我只有一个问题。在这种情况下,max函数如何计算为1或0。我到处都搜索过,看看在这种情况下PDV中的数据是如何工作的,但没有找到任何东西。请您解释一下在这种情况下PDV是如何处理数据的?MAX()函数是SQL聚合函数。它将找到组上的最大值。它所取的最大值是对布尔表达式求值的结果。SAS将布尔表达式计算为1(真)或0(假)。所以max(condition)正在计算condition是否为真。如果条件从不为false,则Min(condition)将计算,在这种情况下,Min()将为一。。