【问题标题】:Exclude intervals that overlap between two data frame's (by range of two column values)排除两个数据框之间重叠的间隔(按两列值的范围)
【发布时间】:2016-02-14 05:16:32
【问题描述】:

这几乎是我之前提出的问题的扩展,但我遇到了一个尚未找到解决方案的新问题。

这里是原问答:Find matching intervals in data frame by range of two column values

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

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

使用相同的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 解决的,但我仍然不太熟悉能够解决这个问题 - 假设这是回答这个问题的最佳方法。

谢谢!

【问题讨论】:

  • 您的描述和期望的输出相互矛盾。如果间隙的顺序无关紧要,那么@jenesaisquoi 的答案是正确的。如果间隙的顺序确实很重要(正如我从您的描述中了解到的那样),那么输出还包括带有 Sequence == B 的行,用于 ADAM。这导致 6 行的最终结果。
  • 这是一个只考虑一个名称的所需结果的快速示例 - 实际数据框要大得多,但我不想写出整个结果。

标签: r data.table


【解决方案1】:

这段代码应该适合你

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

【讨论】:

  • data.tables 不是更快,因为你需要使用相应的避免复制等功能才能看到改进。
  • 哦,我知道了。我的意思是它们可以更快。
  • 重点是,上面的代码并没有真正利用任何data.table代码。
  • 代码的重点不是展示data.tables @他们最好的,而只是提供问题的答案策略。
  • 话虽如此,我更新了我的评论以反映它并不严格依赖于 data.tables 但我只是用它们编写的事实 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多