#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