Я не уверен, правильно ли я понял ваш вопрос:
1.Создать минимальный воспроизводимый пример:
df <-structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L),
Start_date = c("01/01/2000", "06/01/2000", "16/05/2000", "06/07/2016", "10/10/2019", "02/08/2000", "07/08/2006", "05/09/2012"),
End_date = c("05/01/2000", "15/05/2000","07/04/2018", "09/10/2019", "14/12/2019", "06/08/2006", "15/02/2020", "09/11/2017")),
class = "data.frame", row.names = c(NA, -8L))
head(df)
Возвращает:
ID Start_date End_date
1 1 01/01/2000 05/01/2000
2 1 06/01/2000 15/05/2000
3 1 16/05/2000 07/04/2018
4 2 06/07/2016 09/10/2019
5 2 10/10/2019 14/12/2019
6 3 02/08/2000 06/08/2006
Предлагаемое решение с использованием dplyr
Формат столбцов даты as.Date
:
library(dplyr)
df_formated <- df %>%
mutate(Start_date = as.Date(Start_date, "%d/%m/%Y"),
End_date = as.Date(End_date, "%d/%m/%Y"))
str(df)
Возвращает:
'data.frame': 8 obs. of 3 variables:
$ ID : int 1 1 1 2 2 3 3 4
$ Start_date: chr "01/01/2000" "06/01/2000" "16/05/2000" "06/07/2016" ...
$ End_date : chr "05/01/2000" "15/05/2000" "07/04/2018" "09/10/2019" ...
Фильтровать по cutoff_date
и считать вхождения и фильтрация по min_number_of_occurences
:
cutoff_date <- as.Date("01/01/2001", "%d/%m/%Y")
min_number_of_occurences <- 3
df_formated %>%
filter(Start_date < cutoff_date) %>%
group_by(ID) %>%
summarise(N = n()) %>%
filter(N >= min_number_of_occurences)
Возвращает:
# A tibble: 1 x 2
ID N
<int> <int>
1 1 3