这几乎是我提出的上一个问题的延伸,但我遇到了一个我没有找到解决方案的新问题。
以下是原始问题和答案: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部分解决的,但我仍然不太熟悉它能够解决这个问题 - 假设这是回答这个问题的最好方法。
谢谢!
答案 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