У меня достаточно большая (3 миллиона строк) таблица данных, содержащая счета и платежи от многих клиентов, где у каждого клиента есть ряд (уникальных) документов, каждый из которых, в свою очередь, имеет дату создания и дату, когда документ оплачивается. Если дата платежа еще не определена, в столбце payment_date указан NA. Данные выглядят примерно так:
dt = data.table(
customer_id = c(rep(1,4), rep(2,4)),
document_id = c(1:8),
creation_date = as.Date(c("2005-03-01", "2005-03-03", "2005-03-10", "2005-03-25", "2006-03-01", "2006-03-04", "2006-03-10", "2006-03-12"), "%Y-%m-%d"),
payment_date = as.Date(c("2005-03-05", "2005-03-07", NA, "2005-03-28", "2006-03-05", NA, "2006-03-15", "2006-03-16"), "%Y-%m-%d"),
open_docs_10 = c(0,1,2,1,0,1,2,3),
percentage_open_10 = c(0.0,0.20,0.70,1.0,0.0,0.3,1.0,1.0)
)
Для каждого документа (т. Е. Для строки) я sh рассчитываю (в идеале) две функции:
1) Open_docs_10, то есть количество неоплаченных или «открытых» документов, которые customer_id текущего документа имели в определенном временном окне (скажем, 10 дней) до даты создания document_id. «Открыть» означает, что значение payment_date равно NA, попадает после или попадает во временной интервал, в то время как creation_date находится внутри или до временного интервала.
2) Percentage_open_10, который представляет собой процентное число дней в Время windows у клиента были открытые документы. Количество документов на самом деле не имеет значения; На рисунке показано что-то вроде: «4 из 10 предыдущих дней, когда у этого клиента были открытые платежи, когда был создан этот новый документ».
For 1), я попробовал что-то вроде:
open_docs_10 = dt[,c("customer_id", "document_id", "creation_date", "payment_date")] %>%
.[, open_docs_10 := .[.(customer_id = customer_id, upper = creation_date, lower = creation_date - days(10)),
on = .(customer_id, payment_date >= lower, creation_date > lower), uniqueN(document_id), by=.EACHI
]$V1
]
Но это пока не дает правильного результата, потому что истинное / правильное условие соединения должно быть примерно таким:
payment_date >= lower OR upper >= creation_date >= lower
Кажется, я не могу использовать и / или операторы внутри " на "пункт. Но как мне этого добиться, используя data.table?
Для 2), я понятия не имею, как решить эту проблему.
Я не связан использованием data.table в реальном смысле; может быть, я пытаюсь решить мою проблему трудным способом, когда другой пакет R дал бы намного более умный способ обработки вещей? Любая помощь будет принята с благодарностью!