Вот подход с скользящим соединением.
Сначала мы подмножества данных на Action == "A"
и Action == "X"
и соединяем эти два подмножества друг с другом. Мы используем on = c("Case","Time")
, чтобы присоединиться к одинаковым делам, а затем по времени. В data.table
вы можете выполнить бросок только по последнему условию соединения. Затем мы используем roll = Inf
для отката. По какой-то причине столбец, который вы прокручиваете, объединяется во время соединения, поэтому мы создаем дополнительную копию с именем InitialTime
.
Прокручивающееся соединение перемещается вперед до всех возможных значений в положительном направлении, поэтому мы подмножество на Case
до минимума Time
для всех комбинаций Case
и InitialTime
.
library(data.table)
data[Action == "A",.(Case,Action,Time,InitialTime=Time)][
data[Action == "X",], on = c("Case","Time"), roll = Inf][
,.SD[which.min(Time),.(XTime=Time)],by = .(Case,InitialTime)]
Case InitialTime XTime
1: 1 2020-01-23 12:55:00 2020-04-16 17:50:00
2: 2 2020-01-25 23:04:00 2020-02-12 17:50:00
3: 3 2020-01-26 03:23:00 2020-02-18 21:27:00
4: 3 2020-03-15 03:23:00 2020-03-18 21:27:00
Пример данных
data <- structure(list(Case = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L,
3L, 3L), Action = structure(c(1L, 2L, 3L, 4L, 1L, 4L, 4L, 1L,
3L, 4L, 1L, 4L), .Label = c("A", "B", "C", "X"), class = "factor"),
Time = structure(c(1579802100, 1580026980, 1580203380, 1587073800,
1580011440, 1581547800, 1581634200, 1580026980, 1582078980,
1582079220, 1584256980, 1584581220), class = c("POSIXct",
"POSIXt"), tzone = "")), row.names = c(NA, -12L), class = c("data.table",
"data.frame"))