在每组中,取每一行,检查其开始日期是否大于或等于组中任何其他行的开始日期。然后检查其结束日期是否小于组中任何其他行的结束日期。如果
二者都
这些条件是
TRUE
对于此行,与相比
any
在其他行中,则应过滤掉这一行。
一种步行方式是:
library(tidyverse)
df %>%
filter(df %>%
mutate(across(contains('date'), as.Date)) %>%
group_split(Category) %>%
map(~ sapply(seq(nrow(.x)), function(i) {
!any(.x$date_in[i] >= .x$date_in[-i] &
.x$date_out[i] <= .x$date_out[-i])
})) %>%
unlist())
#> Category date_in date_out
#> 1 KA 2018-09-05 2018-10-08
#> 2 KB 2018-09-24 2018-10-08
上述示例中使用的数据取自问题并可复制
df <- structure(list(Category = c("KA", "KA", "KA", "KB"),
date_in = c("2018-09-05", "2018-09-05", "2018-09-18",
"2018-09-24"),
date_out = c("2018-10-08", "2018-09-18", "2018-09-24",
"2018-10-08")),
class = "data.frame", row.names = c(NA, -4L))