как использовать функцию «перекрытия» для нескольких интервалов?

#r #overlapping

#r #перекрытие

Вопрос:

Я пытаюсь понять, перекрывается ли мой набор данных (или пересекается) друг с другом. Позвольте мне объяснить на моем примере ниже df1 , и df2 start столбец означает, что интервал строки начинается с этой точки, stop означает, что интервал заканчивается в этой точке. Я пытаюсь понять, пересекались ли каждая строка друг с другом или нет, если кто-либо не пересекается, вывод будет FALSE. Итак, в R есть функция ‘overlaps’ (из DescTools пакета), но она не поддерживает проверку нескольких перекрывающихся областей. Вы можете видеть df1 набор данных, в котором все строки пересекаются друг с другом, с другой стороны, df2 не соответствует этому правилу, поскольку строка 5 не пересекается со строкой 2 или строкой 4, мой ожидаемый результат TRUE FALSE, для примера; вывод 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%

редактирование 2: Мое решение: для 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)
  

Комментарии:

1. Возможно, вы хотите что-то вроде all(head(df1$stop, -1) >= tail(df1$start, -1)) ?

2. спасибо @Axeman почему вы использовали -1?

Ответ №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
  

Комментарии:

1. спасибо @pseudospin, но это не работает для df3<-data.frame(start=c(1,4,5,12), stop=c(3,6,10,15))

2. Это дает FALSE , поскольку 1-> 3 не перекрывается с 4-> 6. Если вы считаете, что так и должно быть TRUE , пожалуйста, добавьте этот пример к вопросу и объясните, почему это должно быть ПРАВДОЙ.