R 通过两列值的范围查找数据帧中的匹配间隔

R 通过两列值的范围查找数据帧中的匹配间隔,r,dplyr,R,Dplyr,我有一个时间相关事件的数据框架 以下是一个例子: Name Event Order Sequence start_event end_event duration Group JOHN 1 A 0 19 19 ID1 JOHN 2 A 60

我有一个时间相关事件的数据框架

以下是一个例子:

Name     Event Order     Sequence     start_event     end_event     duration     Group 
JOHN     1               A               0               19          19           ID1
JOHN     2               A               60              112         52           ID1  
JOHN     3               A               392             429         37           ID1  
JOHN     4               B               282             329         47           ID1
JOHN     5               C               147             226         79           ID1  
JOHN     6               C               566             611         45           ID1  
ADAM     1               A               19              75          56           ID2
ADAM     2               A               384             407         23           ID2  
ADAM     3               B               0               79          79           ID2  
ADAM     4               B               505             586         81           ID2
ADAM     5               C               140             205         65           ID2  
ADAM     6               C               522             599         77           ID2  
基本上有两个不同的组,ID 1和ID 2。对于每个组,有18个不同的名称。每个人都以3种不同的顺序出现,A-C。然后他们在这些顺序中有活跃的时间段,我标记开始/结束事件并计算持续时间

我想隔离每个人,并找出他们与相反组ID和相同组ID中的人的时间间隔是否匹配

使用上面的示例数据,我想找出John和Adam在同一时间出现在同一序列中的时间。然后我想将John与ID1/ID2中的17个名字中的其他人进行比较

不需要匹配共享的“活动”时间的确切数量,我只是希望隔离常见的行

我的安慰是在使用dplyr,但我还不能破解这个。我环顾四周,看到了一些类似的例子,有邻接矩阵,但这些例子都有精确的数据点。我无法用一个范围/间隔来计算策略

谢谢大家!

更新: 下面是所需结果的示例

  Name     Event Order     Sequence     start_event     end_event     duration     Group 
    JOHN     3               A               392             429         37           ID1        
    JOHN     5               C               147             226         79           ID1  
    JOHN     6               C               566             611         45           ID1  
    ADAM     2               A               384             407         23           ID2  
    ADAM     5               C               140             205         65           ID2  
    ADAM     6               C               522             599         77           ID2  

我认为您应该为John隔离每个事件行,标记开始/结束时间帧,然后在数据帧的其余部分遍历每个名称和事件,以找到首先符合相同序列的时间点,然后再针对John的基准标记开始/结束时间帧

据我所知,您希望返回具有特定序列号的John事件与具有相同序列值的其他任何人的事件重叠的任何行。要实现此目的,可以使用“拆分应用合并”按顺序拆分,标识重叠行,然后重新合并:

overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
  jpos <- which(x$Name == "JOHN")
  njpos <- which(x$Name != "JOHN")
  over <- outer(jpos, njpos, function(a, b) {
    overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
  })
  x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
}))
#      Name EventOrder Sequence start_event end_event duration Group
# A.2  JOHN          2        A          60       112       52   ID1
# A.3  JOHN          3        A         392       429       37   ID1
# A.7  ADAM          1        A          19        75       56   ID2
# A.8  ADAM          2        A         384       407       23   ID2
# C.5  JOHN          5        C         147       226       79   ID1
# C.6  JOHN          6        C         566       611       45   ID1
# C.11 ADAM          5        C         140       205       65   ID2
# C.12 ADAM          6        C         522       599       77   ID2
如果希望能够计算指定用户对的重叠,可以通过将操作包装到指定要处理的用户对的函数中来完成:

overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
pair.overlap <- function(dat, user1, user2) {
  dat <- dat[dat$Name %in% c(user1, user2),]
  do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
    jpos <- which(x$Name == user1)
    njpos <- which(x$Name == user2)
    over <- outer(jpos, njpos, function(a, b) {
      overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
    })
    x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
  }))
}

此软件包应该有帮助:从
数据中签出
?foverlaps
。表
软件包和/或
[0,19]
对于A,John with
[19.75]
对于A,Adam?@Arun I在
重叠
函数中使用
不包括重叠为0的情况。如果OP希望包括端点接触但间隔之间没有重叠的情况,他们可以将其更改为
重叠中的
=
。这里的重叠为1,而不是0。因此,您使用的闭合间隔
[]
具有误导性。共有17个名称,OP希望对所有这些名称进行比较them@wetcoaster前两个代码块处理一个名称(在本例中为John)与所有其他名称的所有重叠。您可以简单地将“JOHN”更改为其他名称,以检查不同名称的所有重叠。
overlap <- function(start1, end1, start2, end2) pmin(end1, end2) > pmax(start2, start1)
pair.overlap <- function(dat, user1, user2) {
  dat <- dat[dat$Name %in% c(user1, user2),]
  do.call(rbind, lapply(split(dat, dat$Sequence), function(x) {
    jpos <- which(x$Name == user1)
    njpos <- which(x$Name == user2)
    over <- outer(jpos, njpos, function(a, b) {
      overlap(x$start_event[a], x$end_event[a], x$start_event[b], x$end_event[b])
    })
    x[c(jpos[rowSums(over) > 0], njpos[colSums(over) > 0]),]
  }))
}
apply(combn(unique(as.character(dat$Name)), 2), 2, function(x) pair.overlap(dat, x[1], x[2]))