#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
, пожалуйста, добавьте этот пример к вопросу и объясните, почему это должно быть ПРАВДОЙ.