Подсчитайте количество уникальных значений, появляющихся заданное количество раз в диапазоне - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть набор данных в Excel, который структурирован следующим образом:

A    B            C
ID   Start_date   End_date
1    01/01/2000   05/01/2000
1    06/01/2000   15/05/2000
1    16/05/2000   07/04/2018
2    06/07/2016   09/10/2019
2    10/10/2019   14/12/2019
3    02/08/2000   06/08/2006
3    07/08/2006   15/02/2020
4    05/09/2012   09/11/2017

Я хотел бы создать временной ряд из числа уникальных значений в указанном выше наборе данных, которые встречаются более 3 раз в За 12 месяцев до любого месяца в диапазоне дат, указанном в наборе данных (в данном случае 01/01/2000 - 15/02/2020). Так, например, число уникальных значений, появляющихся более трех раз за 12 месяцев до января 2001 года, будет равно 1 (ID = 1).

Я пробовал это в Excel, используя следующую формулу:

{=SUM(--(FREQUENCY(IF(($B$2:$B$8<=EOMONTH('Time Series'!A2,0))*($C$2:$C$8>=EOMONTH('Time Series'!A2,-12),$A$2:$A$8),$A$2:$A$8)>0))}

Где значение в 'Time Series'!A2 - январь 2001 года.

Однако это возвращает только количество уникальных значений, которые произошли за 12 месяцев до января 2001 года, а не сколько уникальные значения встречаются более трех раз за период.

Любая помощь по этому вопросу будет принята с благодарностью - хотя я делал это в Excel до сих пор, я был бы открыт для выполнения вычисления в R, если это будет доказать проще.

1 Ответ

1 голос
/ 18 февраля 2020

Я не уверен, правильно ли я понял ваш вопрос:

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
...