【问题标题】:how to use 'overlaps' function for multiple intervals?如何对多个间隔使用“重叠”功能?
【发布时间】:2020-10-20 18:33:43
【问题描述】:

我试图了解我的数据集是否相互重叠(或相交)。让我用下面的例子来解释df1 and df2start 列的意思是,行的间隔从那个点开始,stop 表示间隔在那个点结束。我试图了解每一行是否相交,如果有人不相交,则输出将为 FALSE。因此,R 中有“重叠”(来自DescTools 包)函数,但它不支持检查多个重叠区域。您可以看到df1 数据集,其中所有行都相互交叉,另一方面,df2 不符合此规则,因为第 5 行与第 2 行或第 4 行不相交,我的预期输出为 TRUE假,例如; df1 的输出为 TRUE,df2 的输出为 FALSE。谢谢。

df1<-data.frame(start=c(100,90,130,110), stop=c(200,140,270,150))

df2<-data.frame(start=c(100,90,130,110, 170), stop=c(200,140,270,150,190))

编辑1:

 library(DescTools)

(1,3) %overlaps% (2,5),我尝试对我的数据集的每一行都这样做,我的意思是每一行与%overlaps% 的其他行相比。

edit2:我的解决方案是:对于 df1

 x<-combinations(nrow(df1),2)
    
    TF <- NULL
    for (ill in 1:nrow(x)) {TF[ill]<- df[x[ill,1],] %overlaps% df[x[ill,2],]  }
    T<-all(TF)

【问题讨论】:

  • 也许你想要all(head(df1$stop, -1) &gt;= tail(df1$start, -1))这样的东西?
  • 谢谢@Axeman 你为什么用-1?

标签: r overlapping


【解决方案1】:

我不确定,我是否正确地回答了你的问题。但是你可能会寻找类似的东西

library(DescTools)
 
all(apply(df1, 1, function(x) all(apply(df1, 1, `%overlaps%`, x))))
# [1] TRUE

all(apply(df2, 1, function(x) all(apply(df2, 1, `%overlaps%`, x))))
# [1] FALSE

?

【讨论】:

    【解决方案2】:

    您只需要在任何行停止后没有任何行开始,

    min(df1$stop) >= max(df1$start)
    #> [1] TRUE
    min(df2$stop) >= max(df2$start)
    #> [1] FALSE
    

    【讨论】:

    • 感谢@pseudospin,但它不适用于df3&lt;-data.frame(start=c(1,4,5,12), stop=c(3,6,10,15))
    • 它给出FALSE,因为 1->3 不与 4->6 重叠。如果您认为它应该是TRUE,那么请将此示例添加到问题中并解释为什么它应该是 TRUE。
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多