Первоначально данные представлялись в виде разных идентификаторов, имеющих отношение родитель-потомок, и каждая строка представляла различную сделку и ее идентификатор.Исходный набор данных, который мне нужно проанализировать, выглядит следующим образом.
dt.original.data <- structure(list(msg_seq_nb = c("0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494",
"0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541", "0024541", "0024569"
), orig_msg_seq_nb = c(NA, NA, "0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494",
"0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541")
, trc_st = c("T","C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R")
, trd_rpt_dt = structure(c(15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987), class = "Date")
, trd_rpt_tm = c(34838, 34853, 34853, 34863, 34863, 36231, 36231, 36305, 36305, 36328, 36328, 36330, 36330, 38831, 38831, 38925, 38925, 42984, 42984, 43002, 43002))
, row.names = c(NA, -21L), class = c("data.table", "data.frame"))
> dt.original.data
msg_seq_nb orig_msg_seq_nb trc_st trd_rpt_dt trd_rpt_tm
1: 0005747 <NA> T 2013-10-09 34838
2: 0005747 <NA> C 2013-10-09 34853
3: 0005765 0005747 R 2013-10-09 34853
4: 0005765 0005747 C 2013-10-09 34863
5: 0005783 0005765 R 2013-10-09 34863
6: 0005783 0005765 C 2013-10-09 36231
7: 0008333 0005783 R 2013-10-09 36231
8: 0008333 0005783 C 2013-10-09 36305
Как вы можете видеть, существует иерархическая связь между всеми сделками, введенными через соединение между orig_msg_seq_nb
до msg_seq_nb
.Поэтому мне удалось использовать рекурсивные объединения, чтобы в основном добавить совпадающие комбинации в одну строку.Это было сделано, используя ответ, который я дал на этот вопрос https://stackoverflow.com/a/53395260/5795592, и выдержка из этого результата выглядит следующим образом:
> msg_seq_nb Initial.Trade.Status Initial.Trd.Rpt.Dt Initial.Trd.Rpt.Tm J2.Msg.Nb J2.Trade.Status J2.Trd.Rpt.Tm
1: 0005747 T 2013-10-09 34838 0005765 R 34853
2: 0005747 T 2013-10-09 34838 0005765 C 34863
Теперь я хотел бы проанализировать каждую цепочку отношений и хотел быизвлекать статус в конце каждой цепочки отношений.Таким образом, в случае приведенных выше примеров данных, поскольку последний введенный статус сделки в trc_st msg_seq_nb
0008333
равен C
, мне необходимо удалить все msg_seq_nb иерархической цепочки.
На основеокончательный статус этой цепочки отношений - которая изначально была последовательностью различных сделок - определяет, останутся ли сделки с идентификаторами в исходном наборе данных или же необходимо обновить начальный статус с помощью конечного статуса, то есть статуса после последней рекурсивнойшаг.
Это как-то связано с этим вопросом SQL https://dba.stackexchange.com/questions/96098/finding-the-end-of-a-relationship-chain-optimally