确定4个连续观察

时间:2019-06-10 16:16:16

标签: sql sas proc

我对SAS非常陌生,非常感谢您提供一些指导。我创建了一个成千上万个观测数据集,在其中我需要通过两个字段(人员,业务员)来识别4个连续的每月实例的发生。也就是说:“在13个月内,与人员连续4个月联系在一起的职员”

在准备过程中,我为每个月(即2016.01,2019.02)分配了一个INT值,该值指示了它在我关注的13个月时间内的位置。

这是一个模拟样本:

PersonID    ClerkID monthINT
123456          789415  1
123456          789415  2
123456          789415  3
123456          789415  4
123456          789415  6
123456          789415  8
123456          789415  10
123456          789415  11
123456          789415  12
123456          789415  13

2 个答案:

答案 0 :(得分:1)

只需保持运行计数即可。当您遇到新的ID或出现缺口时,请重置计数。

data want;
  set have ;
  by PersonID ClerkID monthINT ;
  if monthint-1=lag(monthint) and not first.clerkid then run_length+1;
  else run_length=1;
  flag = run_length >= 4;
run;

结果:

       Person     Clerk    month     run_
Obs      ID        ID       INT     length    flag

  1    123456    789415       1        1        0
  2    123456    789415       2        2        0
  3    123456    789415       3        3        0
  4    123456    789415       4        4        1
  5    123456    789415       6        1        0
  6    123456    789415       8        1        0
  7    123456    789415      10        1        0
  8    123456    789415      11        2        0
  9    123456    789415      12        3        0
 10    123456    789415      13        4        1

答案 1 :(得分:0)

您可以使用SQL通过自连接获得所需的结果集。

加入条件self.monthInt between each.monthId and each.monthId-3查找间隔为4个月的候选者,而条件count (distinct each.monthInt) = 4确保在候选间隔中每个月都有交互作用。

select self.PersonId, self.ClerkID, max(self.monthInt) as monthOf4thInteraction
from 
  have as self
join 
  have as each
on 
  self.PersonId = each.PersonId and
  self.ClerkId = each.ClerkId and
  self.monthInt between each.monthId and each.monthId-3
group by 
  self.PersonId, self.ClerkId, self.monthInt
having count (distinct each.monthId) = 4