排除两个数据帧之间重叠的间隔(按两个列值的范围)

时间:2016-02-14 05:16:33

标签: r data.table

这几乎是我提出的上一个问题的延伸,但我遇到了一个我没有找到解决方案的新问题。

以下是原始问题和答案:Find matching intervals in data frame by range of two column values

(这发现在同一数据框中不同名称之间常见的重叠间隔)

我现在想要找到一种方法,当与新数据帧DF2重叠间隔时,在DF1中排除行。

使用相同的 DF1

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           ID1
ADAM     2               A               384             407         23           ID1  
ADAM     3               B               0               79          79           ID1  
ADAM     4               B               505             586         81           ID1
ADAM     5               C               140             205         65           ID1  
ADAM     6               C               522             599         77           ID1  

这将持续18个不同的名称和两个ID组。

现在有第二个数据框,其间隔我希望从上面的数据框中排除。

以下是 DF2

的示例
Name     Event Order     Sequence     start_event     end_event     duration     Group 
GAP1     1               A               55               121         66           ID1
GAP2     2               A               394              419         25           ID1  
GAP3     3               C               502              635         133          ID1  

IE,我希望在DF1中为每个“名称”找到任何间隔,即在相同的“序列”中,并且在DF2中找到的间隔的任何点都有重叠时间(任何部分,无论它是否在开始活动,或在结束活动中途开始和结束)。我想迭代DF1中每个不同的“名称”。此外,序列很重要,所以我只想返回序列A和序列A之间发现的结果,然后是序列B和序列B,最后是序列C和序列C.

所需结果(仅显示名字):

Name     Event Order     Sequence     start_event     end_event     duration     Group 
JOHN     1               A               0               19          19           ID1
JOHN     4               B               282             329         47           ID1
JOHN     5               C               147             226         79           ID1  
ADAM     3               B               0               79          79           ID1  
ADAM     4               B               505             586         81           ID1
ADAM     5               C               140             205         65           ID1  

上次答案是通过foverlaps部分解决的,但我仍然不太熟悉它能够解决这个问题 - 假设这是回答这个问题的最好方法。

谢谢!

1 个答案:

答案 0 :(得分:2)

这段代码应该适合你

library(data.table)

Dt1 <- data.table(a = 1:1000,b=1:1000 + 100)
Dt2 <- data.table(a = 100:200,b=100:200+10)

#identify the positions that are not allowed
badSeq <- unique(unlist(lapply(1:nrow(Dt2),function(i) Dt2[i,a:b,])))

#select for the rows outside of the range
correctPos <- sapply(1:nrow(Dt1),
                 function(i)
                   all(!Dt1[i,a:b %in% badSeq]))


Dt1[correctPos,]

我用data.tables而不是data.frames完成了它。我更喜欢他们,他们可以更快。但是您可以将相同的想法应用于data.frame