с dplyr
df=df_foo%>%group_by(Class)%>%
mutate(Overlap=if_else(Min<lag(Max,order_by=Class),TRUE,FALSE))
df$Overlap[which(df$Overlap==TRUE)-1]=TRUE
df$Overlap[which(is.na(df$Overlap))]=FALSE
> df
# A tibble: 12 x 4
# Groups: Class [2]
Class Min Max Overlap
<fct> <dbl> <dbl> <lgl>
1 A 100 200 FALSE
2 A 200 210 FALSE
3 A 210 310 FALSE
4 A 500 630 TRUE
5 A 510 530 TRUE
6 A 705 800 FALSE
7 B 100 200 FALSE
8 B 200 210 FALSE
9 B 210 310 FALSE
10 B 500 630 TRUE
11 B 510 530 TRUE
12 B 705 800 FALSE
Этот код предполагает, что ваши значения находятся в порядке возрастания, поскольку он проверяет только предыдущую строку.
edit
Не самый красивый, но работает.
df_foo$Class=as.character.factor(df_foo$Class)
df_foo=as.data.frame(df_foo)
df_foo$Overlap=rep("FALSE",nrow(df_foo))
for (i in 1:nrow(df_foo)){
aux=FALSE
class=df_foo$Class[i]
df=df_foo[-i,]%>%filter(.,Class==class)
for (j in 1:nrow(df)){
if (df_foo[i,"Min"]<df[j,"Max"] & df_foo[i,"Max"] > df[j,"Min"]){
aux=TRUE
}
}
df_foo[i,"Overlap"]=aux
}
> df_foo
Class Min Max Overlap
1 A 500 630 TRUE
2 A 100 200 FALSE
3 B 100 200 FALSE
4 A 210 310 FALSE
5 A 200 210 FALSE
6 B 210 310 FALSE
7 A 510 530 TRUE
8 B 200 210 FALSE
9 A 705 800 FALSE
10 B 500 630 TRUE
11 B 510 530 TRUE
12 B 705 800 FALSE
Должен быть способ сделать это с dplyr
, но я не мог понять это,Что происходит, так это то, что он проходит через каждый ряд df_foo
;он генерирует dataframe
со всеми другими строками той же группы и сравнивает, есть ли совпадения (min<max
и max<min
)