Я ищу individual id
в таблице events_table и вычисляю total_duration
как сумму продолжительности всех событий до date
.
Продолжительность - это время между date_start
и date
(таблица1), если событие не закончилось (т.е. имеет date_end
), и в этом случае если date_end < date
, duration = date_end - date_start
.
В псевдокоде:
IF (date>date_start) Then{
IF(date_end < date & date_end != NA) Then{
duration = date_end-date_start
} else if (date_start < date) {
duration = date - date_start
}
}
Then sum all the durations separately for each "individual_id" and "date" combo
Я использую data.tables, так как у меня большие таблицы (> 1 млн строк).
Мои данные выглядят примерно так:
table1 <- fread(
"individual id | date
1 | 2019-01-02
1 | 2019-01-03
2 | 2019-01-02
2 | 2019-01-03",
sep ="|"
)
events_table<- fread(
"individual id | date_start | date_end
1 | 2018-01-02 | NA
1 | 2018-01-04 | 2018-07-01
1 | 2018-01-05 | NA
2 | 2018-01-01 | NA
2 | 2018-01-02 | NA
2 | 2018-01-05 | 2018-11-21",
sep = "|"
)
Результат должен быть следующим:
table1 <- fread(
"individual id | date | total_duration
1 | 2019-01-02 | 905
1 | 2019-01-03 | 907
2 | 2019-01-02 | 1051
2 | 2019-01-03 | 1053",
sep ="|"
)
Мое лучшее предположение о начале запроса исходит из:
table1[, total_duration:= events_table[table1,
on = .(`individual id`, date>date_start),
sum(date-date_start),
by = .EACHI][["V1"]]]
Но я не знаю синтаксиса для включения условия if.
Спасибо за любую помощь.
"
во втором фреде - person akrun   schedule 17.04.2019