Подсчитайте интервалы дат по группе в R с учетом того, что при перекрытии дат просто посчитайте их один раз

#r #data.table

#r #data.table

Вопрос:

Для разных групп идентификаторов есть столбец даты, и у каждого наблюдения есть количество дней, к которому нужно добавить номер.

 library("data.table")

data <- data.table(ID = c(1,1,2,2,3,3,3),
                   Date =c("01/Sep/2020","11/Sep/2020", "01/Sep/2020",
                           "08/Sep/2020", "01/Aug/2020", "04/Aug/2020",
                           "10/Aug/2020"),
                   days_to_be_added = c(10,10,10,08,05,05,30))

data[, Date := as.Date(Date, format = "%d/%h/%Y")]

  
    ID       Date      days_to_be_added
1:  1 2020-09-01               10
2:  1 2020-09-11               10
3:  2 2020-09-01               10
4:  2 2020-09-08                8
5:  3 2020-08-01                5
6:  3 2020-08-04                5
7:  3 2020-08-10               30
  

Я должен получить интервал дат для каждой группы с идентификатором таким образом, чтобы каждая дата добавлялась в ‘days_to_be_added_group’ и количество дней подсчитывалось между ними. Если какая-либо дата перекрывается, то они подсчитываются только один раз.

Пример: для идентификатора 2 :

 3rd row : **1 Sep 2020** to **10 Sep 2020** is 10 days [as Days_to_be_added is 10]
4th row : **8 Sep 2020** to **15 Sep 2020** is 8 days [as Days to be added is 8]
But the total number of days for ID 2 should come as **15 days** since 8 Sep to 10 Sep is overlap for the ID group and should be counted once.
  
 **Expected output:**

ID  Number_of_days
1    20
2    15
3    38
```

**Note** If there are any **Date** as "NA" they should be ignored
  

Ответ №1:

Вот один из подходов.

Добавьте строки для каждого дня, seq.Date начиная с Date для каждого ID и продолжая для days_to_be_added .

Тогда Number_of_days было бы общее количество уникальных day значений для каждого ID , так что перекрытие day не будет учитываться дважды.

 data[, .(day = seq.Date(Date, by = 'day', length.out = days_to_be_added))
     , by = .(ID, 1:nrow(data))
     ][, .(Number_of_days = uniqueN(day)), by = ID][]
  

Вывод

    ID Number_of_days
1:  1             20
2:  2             15
3:  3             38